Tutorial: Erstellen von Prä- und Postereignissen mit einem Webhook mit Automatisierung
Gilt für: ✔️ Windows-VMs ✔️ Linux-VMs ✔️ Lokale Umgebung ✔️ Azure-VMs ✔️ Azure Arc-fähige Server.
Pre- und Postereignisse, auch als Pre- und Postskripts bekannt, ermöglichen es Ihnen, benutzerdefinierte Aktionen vor und nach der geplanten Installation von Patches auszuführen. Eines der am häufigsten verwendeten Szenarien besteht darin, eine VM zu starten und zu beenden. Mit Preeignissen können Sie ein Vorabpatchskript ausführen, um den virtuellen Computer zu starten, bevor Sie den planmäßigen Patchprozess initiieren. Sobald das planmäßige Patchen abgeschlossen ist und der Server neu gestartet wird, kann ein Skript nach dem Patchen ausgeführt werden, um die VM sicher herunterzufahren.
In diesem Tutorial wird erläutert, wie Sie Pre- und Postereignissen erstellen, um einen virtuellen Computer in einem planmäßigen Patchworkflow mithilfe eines Webhooks zu starten und zu beenden.
In diesem Tutorial lernen Sie Folgendes:
- Voraussetzungen
- Erstellen und Veröffentlichen des Automatisierungsrunbooks
- Hinzufügen von Webhooks
- Erstellen eines Ereignisabonnements
Voraussetzungen
Stellen Sie sicher, dass Sie das PowerShell 7.2-Runbook verwenden.
Zuweisen von Berechtigungen zu verwalteten Identitäten – Sie können Berechtigungen für die entsprechende verwaltete Identität zuweisen. Das Runbook kann die systemseitig zugewiesene verwaltete Identität des Automation-Kontos oder eine benutzerseitig zugewiesene verwaltete Identität verwenden.
Sie können entweder Portal- oder PowerShell-Cmdlets verwenden, um jeder Identität Berechtigungen zuzuweisen:
Führen Sie die Schritte unter Zuweisen von Azure-Rollen mithilfe des Azure-Portals aus, um Berechtigungen zuzuweisen
- Importieren Sie das
Az.ResourceGraph
-Modul, und stellen Sie sicher, dass das Modul mit der Modulversion 2.0.3 auf ThreadJob aktualisiert wird.
Erstellen und Veröffentlichen des Automatisierungsrunbooks
Melden Sie sich beim Azure-Portal an, und navigieren Sie zu Ihrem Azure Automation-Konto
Erstellen und Veröffentlichen eines Automatisierungsrunbooks.
Wenn Sie Runbooks verwendet haben, die für Pre- oder Postaufgaben in Azure Automation Update Management eingesetzt wurden, müssen Sie unbedingt die folgenden Schritte ausführen, um unerwartete Auswirkungen auf Ihre Maschinen und fehlgeschlagene Wartungsläufe zu vermeiden.
Parsen Sie für Ihre Runbooks die Webhooknutzlast, um sicherzustellen, dass sie nur bei Microsoft.Maintenance.PreMaintenanceEvent- oder Microsoft.Maintenance.PostMaintenanceEvent-Ereignissen ausgelöst wird. Standardmäßig werden Webhooks bei anderen Abonnementereignissen ausgelöst, wenn ein anderes Ereignis mit demselben Endpunkt hinzugefügt wird.
- Weitere Informationen finden Sie unter Azure Event Grid-Ereignisschema.
- Weitere Informationen finden Sie unter Event Grid-Schema speziell für Wartungskonfigurationen
- Sehen Sie sich den unten aufgeführten Code an:
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 }
Der Parameter SoftwareUpdateConfigurationRunContext, der Informationen über die Liste der Maschinen in der Updatebereitstellung enthält, wird nicht an die Pre- oder Postskripte übergeben, wenn Sie diese für Pre- oder Postereignisse bei der Verwendung vom Automatisierungswebhook verwenden. Sie können entweder die Liste der Maschinen von Azure Resource Graph abfragen oder die Liste der Maschinen in den Skripten codieren lassen.
- Stellen Sie sicher, dass den verwalteten Identitäten, die Sie im Skript verwenden, die richtigen Rollen und Berechtigungen gewährt werden, um Ressourcendiagrammabfragen auszuführen und Maschinen zu starten oder zu stoppen.
- Anzeigen der Berechtigungen im Zusammenhang mit Ressourcendiagrammabfragen
- Weitere Informationen finden Sie unter Die Rolle „Mitwirkende Fachkraft bei virtuellen Maschinen“.
- Sehen Sie sich den unten aufgeführten Code an:
Weitere Informationen finden Sie unter Webhooknutzlast
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 } }
Zur Anpassung können Sie entweder Ihre vorhandenen Skripte mit den oben genannten Änderungen verwenden oder die folgenden Skripte.
Beispielskripts
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
}
}
Hinzufügen von Webhooks
Fügen Sie Webhooks zu den oben veröffentlichten Runbooks hinzu, und kopieren Sie die Webhooks-URLs.
Hinweis
Stellen Sie sicher, dass die URL kopiert wird, nachdem Sie einen Webhook erstellt haben, da Sie die URL nicht erneut abrufen können.
Erstellen eines Ereignisabonnements
Melden Sie sich beim Azure-Portal an, und navigieren Sie zu Ihrem Azure Update Manager.
Wählen Sie unter Verwalten erst Computer und dann Wartungskonfiguration aus.
Wählen Sie auf der Seite Wartungskonfiguration die Konfiguration aus.
Wählen Sie unter Einstellungen die Option Ereignisse aus.
Wählen Sie + Ereignisabonnement aus, um ein Ereignis vor oder nach der Wartung zu erstellen.
Geben Sie auf der Seite Ereignisabonnement erstellen die folgenden Details ein:
- Geben Sie im Abschnitt Details zum Ereignisabonnement einen geeigneten Namen an.
- Behalten Sie für das Schema die Option Event Grid-Schema bei.
- Wählen Sie im Abschnitt Ereignistypen Nach Ereignistypen filtern.
- Wählen Sie Vorwartungsereigniss für ein Preereignis aus.
- Wählen Sie im Abschnitt Endpunktdetails den Webhook-Endpunkt und dann Endpunkt konfigurieren aus.
- Geben Sie die entsprechenden Details an, z. B. die URL des Webhooks vor dem Ereignis, um das Ereignis auszulösen.
- Wählen Sie Nachwartungsereigniss für ein Postereignis aus.
- Wählen Sie Vorwartungsereigniss für ein Preereignis aus.
Klicken Sie auf Erstellen.
Nächste Schritte
- Erfahren Sie mehr über die Übersicht über Vor- und Nachbereitungsereignisse in Azure Update Manager.
- Weitere Informationen zum Erstellen von Vor- und Nachbereitungsereignissen
- Informationen zum Verwalten von Vor- und Nachbereitungsereignissen oder zum Abbrechen einer geplanten Ausführung finden Sie unter Vor- und Nachbereitungsereignisse für eine Wartungskonfiguration.
- Erfahren Sie mehr darüber, wie Sie mithilfe von Azure Functions Vor- und Nachbereitungsereignisse erstellen.