Руководство: Создание событий, происходящих до и после операций, с использованием веб-перехватчика со службой автоматизации
Применимо: ✔️ виртуальные машины ✔️ ✔️ Linux под управлением Windows На локальных ✔️ ✔️ серверах azure Arc.
События предварительного и последующего выполнения, также известные как предварительные или пост-скрипты, позволяют выполнять пользовательские действия до и после установки исправлений по расписанию. Одним из наиболее распространенных сценариев является запуск и остановка виртуальной машины. С предварительными событиями можно запустить скрипт предварительного обновления, чтобы запустить виртуальную машину перед началом процесса исправления расписания. После завершения исправления расписания и перезагрузки сервера можно выполнить скрипт после исправления, чтобы безопасно завершить работу виртуальной машины.
В этом руководстве объясняется, как создать предварительные и постовые события для запуска и остановки виртуальной машины в рабочем процессе исправления расписания с помощью веб-перехватчика.
В этом руководстве описано следующее:
- Необходимые компоненты
- Создание и публикация модуля Runbook службы автоматизации
- Добавление веб-перехватчиков
- Создание подписки на событие
Необходимые компоненты
Убедитесь, что вы используете runbook PowerShell 7.2 .
Назначьте разрешение управляемым удостоверениям. Вы можете назначить разрешения соответствующему управляемому удостоверению. Runbook может использовать управляемое удостоверение учетной записи службы автоматизации, назначаемое пользователем или системой.
Вы можете использовать портал или командлеты PowerShell для назначения разрешений каждому удостоверению:
Выполните действия, описанные в статье "Назначение ролей Azure" с помощью портал Azure для назначения разрешений
Az.ResourceGraph
Импортируйте модуль, убедитесь, что модуль обновлен до ThreadJob с помощью модуля версии 2.0.3.
Создание и публикация модуля Runbook службы автоматизации
Войдите в портал Azure и перейдите к учетной записи служба автоматизации Azure
Создание и публикация модуля Runbook службы автоматизации.
Если вы использовали модули Runbook, которые использовались для задач предварительной или последующей отправки в служба автоматизации Azure управлении обновлениями, важно выполнить приведенные ниже действия, чтобы избежать непредвиденных последствий для компьютеров и неудачных запусков обслуживания.
Для модулей Runbook необходимо проанализировать полезные данные веб-перехватчика, чтобы убедиться, что он активируется только в событиях Microsoft.Maintenance.PreMaintenanceEvent или Microsoft.Maintenance.PostMaintenanceEvent . При разработке веб-перехватчиков активируются другие события подписки, если любое другое событие добавляется с той же конечной точкой.
- См. схему событий Сетка событий Azure.
- См. схему сетки событий, относясь к конфигурациям обслуживания
- См. приведенный ниже код:
param ( [Parameter(Mandatory=$false)] [object] $WebhookData ) $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody $eventType = $notificationPayload[0].eventType if ($eventType -ne "Microsoft.Maintenance.PreMaintenanceEvent" -and $eventType –ne "Microsoft.Maintenance.PostMaintenanceEvent" ) { Write-Output "Webhook not triggered as part of pre or post patching for maintenance run" return }
Параметр SoftwareUpdateConfigurationRunContext , содержащий сведения о списке компьютеров в развертывании обновления, не будет передаваться в скрипты предварительной версии или публикации при использовании веб-перехватчика службы автоматизации. Вы можете запросить список компьютеров из Azure Resource Graph или получить список компьютеров, закодированных в скриптах.
- Убедитесь, что соответствующие роли и разрешения предоставляются управляемым удостоверениям, которые вы используете в скрипте, для выполнения запросов Resource Graph и запуска или остановки компьютеров.
- Просмотр разрешений, связанных с запросами графа ресурсов
- См . роль участника виртуальных машин.
- См. приведенный ниже код:
Просмотр полезных данных веб-перехватчика
param ( [Parameter(Mandatory=$false)] [object] $WebhookData ) Connect-AzAccount -Identity # Install the Resource Graph module from PowerShell Gallery # Install-Module -Name Az.ResourceGraph $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody $maintenanceRunId = $notificationPayload[0].data.CorrelationId $resourceSubscriptionIds = $notificationPayload[0].data.ResourceSubscriptionIds if ($resourceSubscriptionIds.Count -gt 0) { Write-Output "Querying ARG to get machine details[MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]" $argQuery = @"maintenanceresources | where type =~ 'microsoft.maintenance/applyupdates' | where properties.correlationId =~ '$($maintenanceRunId)' | where id has '/providers/microsoft.compute/virtualmachines/' | project id, resourceId = tostring(properties.resourceId) | order by id asc "@ Write-Output "Arg Query Used: $argQuery" $allMachines = [System.Collections.ArrayList]@() $skipToken = $null $res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds $skipToken = $res.SkipToken $allMachines.AddRange($res.Data) } while ($skipToken -ne $null -and $skipToken.Length -ne 0) if ($allMachines.Count -eq 0) { Write-Output "No Machines were found." break } }
Для настройки можно использовать существующие скрипты с приведенными выше изменениями или использовать следующие сценарии.
Примеры сценариев
param
(
[Parameter(Mandatory=$false)]
[object] $WebhookData
)
Connect-AzAccount -Identity
# Install the Resource Graph module from PowerShell Gallery
# Install-Module -Name Az.ResourceGraph
$notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody
$eventType = $notificationPayload[0].eventType
if ($eventType -ne "Microsoft.Maintenance.PreMaintenanceEvent") {
Write-Output "Webhook not triggered as part of pre-patching for maintenance run"
return
}
$maintenanceRunId = $notificationPayload[0].data.CorrelationId
$resourceSubscriptionIds = $notificationPayload[0].data.ResourceSubscriptionIds
if ($resourceSubscriptionIds.Count -eq 0) {
Write-Output "Resource subscriptions are not present."
break
}
Write-Output "Querying ARG to get machine details [MaintenanceRunId=$maintenanceRunId][ResourceSubscriptionIdsCount=$($resourceSubscriptionIds.Count)]"
$argQuery = @"
maintenanceresources
| where type =~ 'microsoft.maintenance/applyupdates'
| where properties.correlationId =~ '$($maintenanceRunId)'
| where id has '/providers/microsoft.compute/virtualmachines/'
| project id, resourceId = tostring(properties.resourceId)
| order by id asc
"@
Write-Output "Arg Query Used: $argQuery"
$allMachines = [System.Collections.ArrayList]@()
$skipToken = $null
do
{
$res = Search-AzGraph -Query $argQuery -First 1000 -SkipToken $skipToken -Subscription $resourceSubscriptionIds
$skipToken = $res.SkipToken
$allMachines.AddRange($res.Data)
} while ($skipToken -ne $null -and $skipToken.Length -ne 0)
if ($allMachines.Count -eq 0) {
Write-Output "No Machines were found."
break
}
$jobIDs= New-Object System.Collections.Generic.List[System.Object]
$startableStates = "stopped" , "stopping", "deallocated", "deallocating"
$allMachines | ForEach-Object {
$vmId = $_.resourceId
$split = $vmId -split "/";
$subscriptionId = $split[2];
$rg = $split[4];
$name = $split[8];
Write-Output ("Subscription Id: " + $subscriptionId)
$mute = Set-AzContext -Subscription $subscriptionId
$vm = Get-AzVM -ResourceGroupName $rg -Name $name -Status -DefaultProfile $mute
$state = ($vm.Statuses[1].DisplayStatus -split " ")[1]
if($state -in $startableStates) {
Write-Output "Starting '$($name)' ..."
$newJob = Start-ThreadJob -ScriptBlock { param($resource, $vmname, $sub) $context = Set-AzContext -Subscription $sub; Start-AzVM -ResourceGroupName $resource -Name $vmname -DefaultProfile $context} -ArgumentList $rg, $name, $subscriptionId
$jobIDs.Add($newJob.Id)
} else {
Write-Output ($name + ": no action taken. State: " + $state)
}
}
$jobsList = $jobIDs.ToArray()
if ($jobsList)
{
Write-Output "Waiting for machines to finish starting..."
Wait-Job -Id $jobsList
}
foreach($id in $jobsList)
{
$job = Get-Job -Id $id
if ($job.Error)
{
Write-Output $job.Error
}
}
Добавление веб-перехватчиков
Добавьте веб-перехватчики в приведенные выше опубликованные модули Runbook и скопируйте URL-адреса веб-перехватчиков.
Примечание.
Скопируйте URL-адрес после создания веб-перехватчика, так как вы не сможете получить URL-адрес еще раз.
Создание подписки на события
Войдите в портал Azure и перейдите в Диспетчер обновлений Azure.
В разделе "Управление" выберите "Компьютеры", "Конфигурация обслуживания".
На странице "Конфигурация обслуживания" выберите конфигурацию.
В разделе "Параметры" выберите "События".
Выберите +Подписка на события событий, чтобы создать событие предварительного или последующего обслуживания.
На странице "Создание подписки на события" введите следующие сведения:
- В разделе "Сведения о подписке на события" укажите соответствующее имя.
- Сохраните схему как схему сетки событий.
- В разделе "Типы событий" отфильтруйте типы событий.
- Выберите событие предварительного обслуживания для предварительного события.
- В разделе сведений о конечной точке выберите конечную точку веб-перехватчика и выберите "Настроить конечную точку".
- Укажите соответствующие сведения, такие как URL-адрес веб-перехватчика предварительного события для активации события.
- Выберите событие после обслуживания для события после выполнения.
- Выберите событие предварительного обслуживания для предварительного события.
Нажмите кнопку создания.
Следующие шаги
- Узнайте больше о предварительных и опубликованных событиях в Диспетчере обновлений Azure.
- Дополнительные сведения о создании событий предварительной и публикации
- Чтобы узнать, как управлять событиями предварительной и публикации или отменять выполнение расписания, см . сведения о событиях конфигурации предварительного и последующего обслуживания.
- Узнайте больше о том, как создавать события предварительной и публикации с помощью Функции Azure.