Självstudie: Skapa händelser före underhåll och efter underhåll med hjälp av en webhook med Automation-runbooks

Gäller för: ✔️ Virtuella Windows-datorer med Virtuella Linux-datorer ✔️ ✔️ Lokal miljö ✔️ Azure VM Azure ✔️ Arc-aktiverade servrar.

Du kan använda händelser före underhåll och efter underhåll för att köra användardefinierade åtgärder före och efter schemalagd korrigeringsinstallation. Ett av de vanligaste scenarierna är att starta och stoppa en virtuell dator (VM). Med händelser före underhåll kan du köra ett skript för att starta den virtuella datorn innan du påbörjar den schemalagda korrigeringsprocessen. När den schemalagda korrigeringen är klar och servern har startats om kan du köra ett skript för att stänga av den virtuella datorn på ett säkert sätt.

I den här guiden beskrivs hur du skapar händelser före och efter underhåll för att starta och stoppa en VM i ett schemalagt korrigeringsarbetsflöde genom att använda en webhook.

I den här handledningen kommer du att:

  • Skapa och publicera en Azure Automation-runbook.
  • Lägg till webhooks.
  • Skapa en händelseprenumeration.

Förutsättningar

  1. Kontrollera att du använder en PowerShell-runbook i version 7.4.

  2. Tilldela behörigheter till lämplig hanterad identitet. Körboken kan använda Automation-kontots systemtilldelade hanterad identitet eller en användartilldelad hanterad identitet.

    Följande skriptexempel (starta och stoppa virtuella datorer) kräver rollen Virtuell datordeltagare eller en anpassad roll med dessa specifika behörigheter:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtuellaMaskiner/startaOm/åtgärd
    • Microsoft.Compute/virtualMachines/powerOff/action

    Du kan använda antingen Azure-portalen eller Azure PowerShell-cmdletar för att tilldela behörigheter till varje identitet:

    Om du vill tilldela behörigheter följer du stegen i Tilldela Azure-roller med hjälp av Azure-portalen.


  1. Importera modulen Az.ResourceGraph . Kontrollera att modulen har uppdaterats till ThreadJob med modulversion 2.0.3.

Skapa och publicera en automationsrunbok

  1. Logga in på Azure-portalen och gå till ditt Azure Automation-konto .

  2. Skapa och publicera en automation-körbok.

  3. Om du använde runbooks för förunderhåll och uppgifter efter underhåll i Azure Automation Update Management är det viktigt att du använder följande steg för att undvika en oväntad påverkan på dina datorer och misslyckade underhållskörningar:

    1. För dina runbooks parsar du webhook-nyttolasten för att säkerställa att den utlöses endast på Microsoft.Maintenance.PreMaintenanceEvent eller Microsoft.Maintenance.PostMaintenanceEvent händelser. Webhooks utlöses avsiktligt på andra prenumerationshändelser om någon annan händelse läggs till med samma slutpunkt.

      • Se Händelseschemat för Azure Event Grid.

      • Se Event Grid-schemat som är specifikt för underhållskonfigurationer.

      • Se följande kod:

        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. Parametern SoftwareUpdateConfigurationRunContext innehåller information om listor över datorer i uppdateringsdistributionen. Det skickas inte till skripten när du använder dem för händelser före underhåll eller efter underhåll när du använder en Automation-webhook. Du kan antingen köra frågor mot listan över datorer från Azure Resource Graph eller ha listan över datorer kodade i skripten.

      • Se till att rätt roller och behörigheter beviljas till de hanterade identiteter som du använder i skriptet, för att köra Resource Graph-frågor och starta eller stoppa datorer.

      • Se behörigheter relaterade till Resource Graph-frågor.

      • Se rollen Virtual Machine Contributor.

      • Se webhookens nyttolast.

      • Se följande kod:

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

Om du vill anpassa kan du antingen använda dina befintliga skript med föregående ändringar eller använda följande skript.

Exempelskript

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

Lägg till webhooks

Lägg till webhooks i tidigare publicerade runbooks och kopiera webhook-URL:erna.

Kommentar

Se till att kopiera URL:en när du har skapat en webhook. Du kan inte hämta URL:en igen.

Skapa en händelseprenumeration

  1. Logga in på Azure-portalen och gå till Azure Uppdateringshanteraren.

  2. Under Hantera väljer du Konfiguration av datorunderhåll>.

  3. Välj konfigurationen i fönstret Underhållskonfiguration .

  4. Under Inställningar väljer du Händelser.

    Skärmbild som visar menyalternativet för händelser.

  5. Välj +Händelseprenumeration för att skapa en händelse före underhåll eller efter underhåll.

    Skärmbild som visar händelseprenumerationer med alternativet att skapa en händelseprenumeration.

  6. Ange ett lämpligt namn i avsnittet Information om händelseprenumeration i fönstret Skapa händelseprenumeration. Behåll schemat som Event Grid-schema.

  7. I avsnittet Händelsetyper för Filtrera till händelsetyper väljer du Händelse före underhåll eller Händelse efter underhåll.

  8. I avsnittet Slutpunktsinformation väljer du Web Hook-slutpunkten och väljer sedan Konfigurera en slutpunkt.

  9. Ange lämplig information, till exempel webbhook-URL:en för före underhåll eller efter underhåll för att utlösa händelsen.

    Skärmbild som visar alternativen för att skapa händelseprenumerationer.

  10. Välj Skapa.