Как использовать Azure Automation - [Полное руководство]
Azure Automation является одним из самых популярных инструментов для запуска скриптов PowerShell в облаке. Вы можете не только управлять своей средой Azure с помощью runbooks, но также и своим арендатором Microsoft Office 365, например.
Автоматизация является ключевой частью ИТ, и как системный администратор, вы должны стремиться автоматизировать большинство своих ежедневных/ручных задач. Написание скрипта может занять некоторое время в начале, но в долгосрочной перспективе сэкономит вам много времени.
В этой статье я объясню, как настроить свою учетную запись Azure Automation и как создать свой первый runbook PowerShell в Azure.
Требования к автоматизации Azure
Существует всего несколько требований, чтобы начать запускать свой скрипт PowerShell в Azure:
- Подписка на Azure (оплата по мере использования)
- Учетная запись автоматизации Azure
Вы можете начать с бесплатной пробной версии подписки Azure, но подписка с оплатой по мере использования тоже не такая уж дорогая.
Совет
Начиная с сентября 2023 года, мы больше не можем использовать аккаунты RunAs. Убедитесь, что вы перенесли свои рабочие процессы для использования управляемых идентификаторов для аутентификации до этой даты. Прочитайте все о управляемых идентификаторах в этой статье.
Цены на автоматизацию Azure
Цены на Azure Automation основаны на количестве минут, в течение которых выполняется задание. С каждой подпиской вы получаете 500 минут времени выполнения заданий и 744 часа для наблюдателей бесплатно каждый месяц.
| Бесплатные единицы в месяц | Цена за дополнительные единицы | |
|---|---|---|
| Время выполнения задания | 500 минут | $0.002 в минуту |
| Наблюдатели | 744 часов | $0.002 в час |
Чтобы дать вам представление, простой скрипт, который проверяет статус MFA у всех пользователей в моем тенанте, занимает всего 1 минуту. Создание командного сайта SharePoint и применение к нему шаблона занимает в общей сложности 30 секунд.
Таким образом, с 500 бесплатными минутами вы сможете автоматизировать большинство своих ежедневных задач 😉 А каждый следующий час стоит всего $0,12.
Начало работы с Azure Automation
Чтобы начать работу с Azure Automation, нам необходимо создать учетную запись Azure Automation и установить соответствующие модули PowerShell.
Войдите в портал Azure
Перейдите на https://portal.azure.com/ и войдите, используя свои учетные данные Office 365.
Перейдите к услугам учетных записей автоматизации
Используйте строку поиска, чтобы найти услуги автоматизации аккаунтов
Создайте новую учетную запись автоматизации
Нажмите Создать, чтобы создать новую учетную запись автоматизации.
- Дайте своей учетной записи автоматизации имя
- Выберите вашу подписку (бесплатный пробный период или оплата по мере использования)
- Создайте или выберите группу ресурсов
Создание группы ресурсов может занять несколько минут.Откройте свою учетную запись Azure Automation
Выберите свою новую учетную запись автоматизации после ее создания.
Установите модули PowerShell
Прежде чем мы сможем начать создание нашего первого руководства по выполнению, нам сначала необходимо установить необходимые модули PowerShell.
Выберите модули и нажмите на Просмотр галереи
Установите следующие модули:
– PnP.PowerShell
– AzureAD
– ExchangeOnlineManagement
Мы теперь создали нашу учетную запись Azure Automation и можем начать с создания нашего первого Runbook.
Аутентификация в Azure Runbook при использовании MFA
Аутентификация в Azure Runbooks всегда является небольшой проблемой. Вы могли бы исключить службы Azure из MFA с помощью правил условного доступа, но это потребовало бы от вас актуализировать все IP-адреса.
Другим вариантом было бы исключить учетную запись службы из MFA, но это не является лучшей практикой. Учетные записи службы могут иметь права глобального администратора, поэтому вы хотите должным образом защитить эти учетные записи.
Так как же вы аутентифицируетесь в AzureAD или Exchange Online в Azure Runbook? Что ж, мы можем использовать учетную запись Azure Run As.
В процессе создания нашей учетной записи Azure Automation мы также автоматически создали учетную запись Run as. Учетная запись Run As обеспечивает аутентификацию для Azure Runbooks, автоматизации и управления ресурсами в Azure Resource Manager с использованием самоподписанного сертификата.
Предупреждение
Начиная с сентября 2023 года, мы больше не можем использовать аккаунты RunAs. Убедитесь, что вы перенесли свои рабочие процессы для использования управляемых идентификаторов для аутентификации до этой даты. Прочитайте все о управляемых идентификаторах в этой статье.
Заметка
Сертификат действителен только в течение одного года. Вам нужно будет убедиться, что вы продлили сертификат до его истечения.
Мы собираемся назначить учетной записи Run As правильные разрешения для доступа к AzureAD, Exchange Online и SharePoint. Для начала нам сначала нужно найти objectId учетной записи.
- Выберите Запуск от имени учетных записей в вашей учетной записи автоматизации Azure.
- Обратите внимание на идентификатор объекта сервисного принципала
Мы собираемся добавлять правильные разрешения по одному. Полный скрипт, который установит все разрешения за один раз, можно найти здесь на моем Github.
Подключение к AzureAD из Azure Runbook
Сначала мы предоставим учетной записи нашего сервисного принципала правильные разрешения для доступа к AzureAD. Убедитесь, что модуль AzureAD установлен локально и откройте PowerShell.
Сначала подключитесь к Azure AD и замените идентификатор объекта сервисного принципала вашим собственным идентификатором объекта.
Connect to Azure AD
Connect-AzureAD
Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"Если вам нужно только читать данные из AzureAD, вы можете предоставить служебному принципалу роль Читателя директории.
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Directory Reader"}).Objectid -RefObjectId $servicePrincipalObjectId
Другой вариант - сделать его Глобальным Администратором, чтобы он мог полностью управлять вашим Active Directory:
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Company Administrator"}).Objectid -RefObjectId $servicePrincipalObjectIdВы можете перечислить все доступные роли в вашем тенанте с помощью следующей команды
Get-AzureADDirectoryRoleТеперь вы можете подключиться к AzureAD с помощью следующего кода в ваших PowerShell Runbook.
Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection
Connect AzureAd
Connect-AzureAD -TenantId $spConnection.TenantId -ApplicationId $spConnection.ApplicationID -CertificateThumbprint $spConnection.CertificateThumbprint | No-Output
Test connection:
"User count:"
(Get-AzureADUser).countПодключитесь к Exchange Online из Runbook Azure
Существует дополнительный шаг, необходимый для предоставления учетной записи сервисного принципала доступа к Exchange Online. Мы должны назначить ей роль администратора Exchange и соответствующие разрешения API.
Connect to Azure AD
Connect-AzureAD
Get the Service Principal based on the object Id
$servicePrincipalObjectId = "6dgw124-0000-1111-1337-abc123def456"
Assign the Exchange Administrator Role
Add-AzureADDirectoryRoleMember -ObjectId (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"}).Objectid -RefObjectId $servicePrincipalObjectIdЕсли у вас нет роли администратора обмена в вашем тенанте, то вы можете активировать её с помощью следующего кода:
if (Get-AzureADDirectoryRole | where-object {$_.DisplayName -eq "Exchange Administrator"} -eq $null) {
Enable-AzureADDirectoryRole -RoleTemplateId (Get-AzureADDirectoryRoleTemplate | Where-Object {$_.DisplayName -eq "Exchange Administrator"}).Objectid
}Для разрешений API Exchange Online мы можем использовать следующий код:
Get the Office 365 Exchange Online App
$EXOApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000002-0000-0ff1-ce00-000000000000'")
$servicePrincipal = Get-AzureADServicePrincipal -ObjectId $servicePrincipalObjectId
Get the roles
$permission = $EXOApp.AppRoles | Where-Object { $_.Value -eq 'Exchange.ManageAsApp' }
Create the permission object
$apiPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
ResourceAppId = $EXOApp.AppId ;
ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{
Id = $permission.Id ;
Type = "Role"
}
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $apiPermission
Теперь все, что вам нужно сделать, это предоставить согласие администратора на разрешения, которые мы назначили.
- Откройте свой Azure Active Directory
- Выберите Регистрации приложений
- Нажмите на Все приложения и выберите свою учетную запись автоматизации.
- Перейдите к Разрешениям API
- Нажмите Предоставить согласие администратора
Теперь вы можете подключиться к Exchange Online в вашем Azure Runbook с помощью следующего кода PowerShell:
Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection
Set your tenant name
$tenantName = "contoso.onmicrosoft.com"
Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName
Test connection
(Get-ExoMailbox).countПодключение к SharePoint/PnPOnline из Azure Runbook
Если вы хотите использовать PnPOnline в своем Azure Runbook, вам необходимо будет предоставить доступ к API SharePoint и, возможно, даже к Graph.
Я использую несколько разрешений для автоматического создания сайтов SharePoint и применения шаблонов с папками по умолчанию. Вам не обязательно нужны все разрешения, но это дает вам представление о том, как их настроить.
Get Office 365 SharePoint Online App
$spApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0ff1-ce00-000000000000'")
Get the roles
All sites full control
$spSitesControl = $SPApp.AppRoles | Where-Object { $_.Value -eq 'Sites.FullControl.All' }
User read write
$spUserControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }
TermStore
$spTermControl= $SPApp.AppRoles | Where-Object { $_.Value -eq 'TermStore.ReadWrite.All' }
NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s
$spPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
ResourceAppId = $spApp.AppId ;
ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id = $spSitesControl.Id;Type = "Role";},
[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id = $spUserControl.Id;Type = "Role";},
[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id = $spTermControl.Id ;Type = "Role";}
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $spPermissionСнова вам нужно будет предоставить администраторское согласие на разрешения:
- Откройте свой Azure Active Directory
- Выберите Регистрации приложений
- Нажмите на Все приложения и выберите свою учетную запись автоматизации.
- Перейдите к Разрешениям API
- Нажмите Предоставить согласие администратора
Чтобы подключиться к PnPOnline, вы можете использовать следующий код в вашем Azure Runbook:
Get the service principal connection details
$spConnection = Get-AutomationConnection -Name AzureRunAsConnection
Connect to PnPOnline
Connect-PnPOnline -ClientId $spConnection.ApplicationID -Url "https://contoso.sharepoint.com" -Tenant contoso.onmicrosoft.com -Thumbprint $spConnection.CertificateThumbprint
Test connection
(get-pnptenantsite).count
Мне также нужен был доступ к Graph, поэтому я добавил и разрешения API для этого:
#
Get Graph App
#
$graphApp = (Get-AzureADServicePrincipal -Filter "AppID eq '00000003-0000-0000-c000-000000000000'")
Group read write
$graphGroupControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'Group.ReadWrite.All' }
User read write
$graphUserControl = $graphApp.AppRoles | Where-Object { $_.Value -eq 'User.ReadWrite.All' }
NOTE: If you format the code below nicely, and copy-paste it, it will make typeID from the Id attribute :s
$graphPermission = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{
ResourceAppId = $graphApp.AppId ;
ResourceAccess = [Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id = $graphGroupControl.Id;Type = "Role";},
[Microsoft.Open.AzureAD.Model.ResourceAccess]@{Id = $graphUserControl.Id;Type = "Role";}
}
$Application = Get-AzureADApplication | Where-Object {$_.AppId -eq $servicePrincipal.AppId}
$Application | Set-AzureADApplication -ReplyUrls 'http://localhost'
$Application | Set-AzureADApplication -RequiredResourceAccess $graphPermissionСнова предоставьте согласие администратора в Azure AD.
Если вы подключили PnPOnline, то вы можете легко получить токен доступа для подключения к Graph:
User Graph
$accessToken = Get-PnPAccessToken
$header = @{
"Content-Type" = "application/json"
Authorization = "Bearer $accessToken"
}
Get users to test Graph
Invoke-RestMethod -Uri "https://graph.microsoft.com/v1.0/users/" -Method Get -Headers $headerРезультат со всеми разрешениями в Azure Active Directory должен выглядеть так:
Вы также можете добавить разрешения в портале Azure к вашей учетной записи сервисного принципала. Это может быть более удобно, если вы не знаете точное название разрешения, которое ищете.
В Azure Active Directory:
- Выберите Регистрации приложений
- Нажмите на Все приложения и выберите свою учетную запись автоматизации.
- Перейдите к разрешениям API
- Нажмите Добавить разрешение
- Выберите API, который вам нужен, например, SharePoint.
- Выберите Разрешения приложения и выберите необходимые вам разрешения.
Использование переменных в Runbook'ах Azure Automation
Прежде чем мы начнем создавать наш первый Runbook, мы сначала взглянем на использование переменных. Вы можете определить глобальные переменные в своем аккаунте автоматизации, которые вы можете использовать и изменять в своих Runbook. Вы можете создать различные типы переменных, и они также могут быть зашифрованы.
Если вы прокрутите вниз в своей учетной записи Azure Automation, вы найдете переменные в разделе Общие ресурсы.
- Откройте Переменные
- Нажмите на Добавить переменную
- Дайте вашей переменной имя
- Выберите тип (Строка, Булев, Дата и время, Целое число, Не указано)
- Введите значение
- Выберите Зашифрованный или нет
Создание Runbook в Azure
С учетом того, что учетная запись Azure Automation настроена и все разрешения назначены, мы можем начать создавать наш первый Runbook.
В вашей учетной записи Azure Automation вы найдете Runbooks. В вашей учетной записи уже есть несколько учебных runbook'ов, но мы собираемся создать новый.
- Нажмите на Создать план выполнения
- Дайте вашему плану действий значащее имя
- Выберите PowerShell для типа Runbook и, возможно, описание, которое объясняет, что делает этот runbook.
- Нажмите на Создать
В этом примере мы собираемся создать Руководство, которое отключает SMTP-аутентификацию для всех пользователей, кроме нескольких учетных записей приложений. Если вы хотите узнать больше о защите вашего кабинета Office 365, обязательно прочитайте эти советы.
Ваш новый Runbook открывается, который по сути является пустым скриптом PowerShell. С левой стороны вы найдете обзор доступных CMDLets, список ваших Runbooks (вы можете запускать другие runbooks из своего runbook) и ресурсы.
Активы могут быть переменными, которые вы объявили в своем аккаунте автоматизации, подключениями, сохраненными учетными данными и сертификатами.
Чтобы отключить SMTP-аутентификацию, мы собираемся подключиться к Exchange Online. Для этого нам понадобится соединение Azure Run As и имя арендатора, которое я добавил в переменную.
Теперь мы можем подключиться к Exchange Online с помощью следующего кода, если вы установили права доступа, как описано в начале:
Get the automation account and tenant name
$spConnection = Get-AutomationConnection -Name 'AzureRunAsConnection'
$tenantName = Get-AutomationVariable -Name 'tenantName'
Connect to ExchangeOnline
Connect-ExchangeOnline -CertificateThumbprint $spConnection.CertificateThumbprint -AppId $spConnection.ApplicationID -Organization $tenantName
$exclusions = @("sa_signatureTool",
"sa_otherImportantTool"
)
$mailboxes = Get-CASMailbox | Where-Object {$_.SmtpClientAuthenticationDisabled -ne $true -and $_.Identity -notin $exclusions}
$mailboxes
foreach ($mailbox in $mailboxes) {
try {
Set-CASMailbox -Identity $mailbox.Identity -SmtpClientAuthenticationDisabled $true
[PSCustomObject]@{
UserPrincipalName = $mailbox.Identity
SmtpClientAuthenticationDisabled = $true
}
}
catch {
[PSCustomObject]@{
UserPrincipalName = $mailbox.Identity
SmtpClientAuthenticationDisabled = $false
}
}
}
Close the connection
Disconnect-ExchangeOnline -Confirm:$falseПеред публикацией руководства вы можете сначала протестировать его в панели тестирования. Это действительно полезно при редактировании существующих руководств, вы можете протестировать ваши изменения перед публикацией, сохраняя при этом рабочую версию.
Расписание автоматизации Azure
Вы можете запланировать выполнение вашего runbook так, чтобы он автоматически запускался через установленный интервал. После публикации вашего runbook нажмите на Ссылка на расписание.
Нажмите на Связать расписание с вашим рабочим процессом, чтобы выбрать (или создать) расписание для вашего Azure Runbook. Одно расписание может использоваться для нескольких рабочих процессов в вашей учетной записи Azure Automation.
Мы должны создать наше первое расписание:
- Нажмите на Добавить расписание
- Дайте вашему расписанию имя
- Установите дату и время начала
- Сделайте это повторяющимся (или выполните только один раз)
- Нажмите на Создать
После того как вы создали распорядок, нажмите ОК, чтобы применить его к вашему рабочему процессу. Вы можете добавить несколько распорядков к вашему рабочему процессу, если хотите.
Ваш рабочий процесс теперь должен автоматически выполняться в соответствии с расписанием, которое вы создали. Вы увидите общий обзор задач на экране обзора рабочего процесса.
Заключение
Когда вы создаете руководства по запуску, всегда убедитесь, что закрываете соединения, когда задачи завершены. В противном случае вы можете запросто использовать все соединения с Exchange Online, например.
Надеюсь, эта статья помогла вам начать создавать ваши Runbook'и в Azure и/или настроить аутентификацию для Office 365.
Если у вас есть вопросы, просто оставьте комментарий ниже.











