Freigeben über


Tutorial: Erstellen von Ereignissen vor und nach der Wartung mithilfe eines Webhooks und Automation-Runbooks

Gilt für: ✔️ Windows-VMs ✔️ Linux-VMs ✔️ Lokale Umgebung ✔️ Azure-VMs ✔️ Azure Arc-fähige Server.

Sie können Vorwartungs- und Nachwartungsereignisse verwenden, um benutzerdefinierte Aktionen vor und nach der geplanten Patchinstallation auszuführen. Eines der am häufigsten verwendeten Szenarien ist das Starten und Beenden eines virtuellen Computers (VM). Mit Ereignissen vor der Wartung können Sie ein Skript ausführen, um den virtuellen Computer zu starten, bevor Sie den geplanten Patchprozess initiieren. Nachdem der geplante Patchvorgang abgeschlossen ist und der Server neu gestartet wird, können Sie ein Skript ausführen, um den virtuellen Computer sicher herunterzufahren.

In diesem Lernprogramm wird erläutert, wie Sie Vorabwartungs- und Nachwartungsereignisse erstellen, um einen virtuellen Computer in einem geplanten Patchworkflow mithilfe eines Webhooks zu starten und zu beenden.

In diesem Tutorial erfahren Sie:

  • Erstellen und Veröffentlichen eines Azure Automation-Runbook.
  • Fügen Sie Webhooks hinzu.
  • Erstellen Sie ein Ereignisabonnement.

Voraussetzungen

  1. Stellen Sie sicher, dass Sie ein PowerShell 7.4-Runbook verwenden.

  2. Weisen Sie der entsprechenden verwalteten Identität Berechtigungen zu. Das Runbook kann die vom System zugewiesene verwaltete Identität des Automatisierungskontos oder eine vom Benutzer zugewiesene verwaltete Identität verwenden.

    Die folgenden Skriptbeispiele (Starten und Beenden von VMs) erfordern die Rolle "Mitwirkender virtueller Computer" oder eine benutzerdefinierte Rolle mit diesen spezifischen Berechtigungen:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action
    • Microsoft.Compute/virtualMachines/powerOff/action

    Sie können entweder das Azure-Portal oder Azure PowerShell-Cmdlets verwenden, um jeder Identität Berechtigungen zuzuweisen:

    Führen Sie zum Zuweisen von Berechtigungen die Schritte unter Zuweisen von Azure-Rollen mithilfe des Azure-Portals aus.


  1. Importieren Sie das Az.ResourceGraph Modul. Stellen Sie sicher, dass das Modul mit der Modulversion 2.0.3 auf ThreadJob aktualisiert wird.

Erstellen und Veröffentlichen eines Automatisierungs-Runbooks

  1. Melden Sie sich beim Azure-Portal an, und wechseln Sie zu Ihrem Azure Automation-Konto .

  2. Erstellen und veröffentlichen Sie ein Automatisierungs-Runbook.

  3. Wenn Sie Runbooks für Vorwartungs- und Nachwartungsaufgaben in Azure Automation Update Management verwendet haben, ist es wichtig, dass Sie die folgenden Schritte ausführen, um unerwartete Auswirkungen auf Ihre Computer zu vermeiden und fehlerhafte Wartungsläufe zu vermeiden:

    1. Parsen Sie für Ihre Runbooks die Webhook-Nutzlast, um sicherzustellen, dass sie nur für Ereignisse vom Typ Microsoft.Maintenance.PreMaintenanceEvent oder Microsoft.Maintenance.PostMaintenanceEvent ausgelöst wird. Standardmäßig werden Webhooks für andere Abonnementereignisse 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 im Ereignisrasterschema speziell für Wartungskonfigurationen.

      • Sehen Sie sich den folgenden 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  
        } 
        
    2. Der Parameter "SoftwareUpdateConfigurationRunContext " enthält Informationen zu Listen von Computern in der Updatebereitstellung. Sie wird nicht an die Skripts übergeben, wenn Sie sie für Ereignisse vor oder nach der Wartung verwenden und dabei einen Automation-Webhook nutzen. 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.

      • Sehen Sie sich die Berechtigungen im Zusammenhang mit Resource Graph-Abfragen an.

      • Siehe die Rolle "Beitragende für virtuelle Maschinen".

      • Siehe die Webhook-Nutzlast.

      • Sehen Sie sich den folgenden Code an:

        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    
        }
        }
        

Zum Anpassen können Sie entweder Ihre vorhandenen Skripts mit den vorherigen Änderungen verwenden oder die folgenden Skripts verwenden.

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 vorherigen veröffentlichten Runbooks hinzu, und kopieren Sie die Webhook-URLs.

Hinweis

Achten Sie darauf, die URL nach dem Erstellen eines Webhooks zu kopieren. Sie können die URL nicht erneut abrufen.

Erstellen eines Ereignisabonnements

  1. Melden Sie sich beim Azure-Portal an, und navigieren Sie zu Azure Update Manager.

  2. Wählen Sie unter "Verwalten" die Option "Maschinen>Wartungskonfiguration" aus.

  3. Wählen Sie im Bereich "Wartungskonfiguration " die Konfiguration aus.

  4. Wählen Sie unter Einstellungen die Option Ereignisse aus.

    Screenshot der Menüoption für Ereignisse.

  5. Wählen Sie +Ereignisabonnement aus, um ein Ereignis vor der Wartung oder nach der Wartung zu erstellen.

    Screenshot, der Ereignisabonnements mit der Option zum Erstellen eines Ereignisabonnements zeigt.

  6. Geben Sie im Bereich " Ereignisabonnement erstellen" im Abschnitt " Ereignisabonnementdetails " einen geeigneten Namen an. Behalten Sie für das Schema die Option Event Grid-Schema bei.

  7. Wählen Sie im Abschnitt Ereignistypen für Nach Ereignistypen filtern die Option Ereignis vor der Wartung oder Ereignis nach der Wartung aus.

  8. Wählen Sie im Abschnitt "Endpunktdetails " den Web Hook-Endpunkt und dann " Endpunkt konfigurieren" aus.

  9. Geben Sie die entsprechenden Details an, etewa die Webhook-URL für das Ereignis vor oder nach der Wartung, um das Ereignis auszulösen.

    Screenshot der Optionen zum Erstellen von Ereignisabonnements.

  10. Klicken Sie auf Erstellen.