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

  1. Stellen Sie sicher, dass Sie das PowerShell 7.2-Runbook verwenden.

  2. 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


  1. 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

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

  2. Erstellen und Veröffentlichen eines Automatisierungsrunbooks.

  3. 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.

    1. 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.

      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, 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:
    3. 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    
      }
      }
      
    4. 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

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

  2. Wählen Sie unter Verwalten erst Computer und dann Wartungskonfiguration aus.

  3. Wählen Sie auf der Seite Wartungskonfiguration die Konfiguration aus.

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

    Screenshot, der die Optionen zur Auswahl des Menüpunkts „Ereignisse“ zeigt.

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

    Screenshot der Optionen zum Auswählen der Ereignisabonnements.

  6. Geben Sie auf der Seite Ereignisabonnement erstellen die folgenden Details ein:

    1. Geben Sie im Abschnitt Details zum Ereignisabonnement einen geeigneten Namen an.
    2. Behalten Sie für das Schema die Option Event Grid-Schema bei.
    3. Wählen Sie im Abschnitt Ereignistypen Nach Ereignistypen filtern.
      1. 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.
      2. Wählen Sie Nachwartungsereigniss für ein Postereignis 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 nach dem Ereignis, um das Ereignis auszulösen. Screenshot der Optionen zum Erstellen der Ereignisabonnements.
  7. Klicken Sie auf Erstellen.

Nächste Schritte