Dela via


Självstudie: Skapa för- och efterhändelser med hjälp av en webhook med Automation

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

Med för- och efterhändelser, även kallade pre/post-scripts, kan du köra användardefinierade åtgärder före och efter installationen av schemakorrigeringen. Ett av de vanligaste scenarierna är att starta och stoppa en virtuell dator. Med förhändelser kan du köra ett prepatching-skript för att starta den virtuella datorn innan du påbörjar schemakorrigeringsprocessen. När schemakorrigeringen är klar och servern startas om kan ett skript efter korrigeringen köras för att stänga av den virtuella datorn på ett säkert sätt

Den här självstudien beskriver hur du skapar för- och efterhändelser för att starta och stoppa en virtuell dator i ett arbetsflöde för schemakorrigering med hjälp av en webhook.

I den här självstudien lär du dig att:

  • Förutsättningar
  • Skapa och publicera Automation-runbook
  • Lägga till webhooks
  • Skapa en händelseprenumeration

Förutsättningar

  1. Se till att du använder PowerShell 7.2-runbook .

  2. Tilldela behörighet till hanterade identiteter – Du kan tilldela behörigheter till lämplig hanterad identitet. Runbooken kan använda antingen den systemtilldelade hanterade identiteten för Automation-kontot eller en användartilldelad hanterad identitet.

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

    Följ stegen i Tilldela Azure-roller med hjälp av Azure-portalen för att tilldela behörigheter


  1. Importera modulen Az.ResourceGraph och se till att modulen uppdateras till ThreadJob med modulversion 2.0.3.

Skapa och publicera Automation-runbook

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

  2. Skapa och publicera en Automation-runbook.

  3. Om du använde Runbooks som användes för för - eller efteraktiviteter i Azure Automation Update Management är det viktigt att du följer stegen nedan för att undvika en oväntad inverkan 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 på Händelser av typen Microsoft.Maintenance.PreMaintenanceEvent eller Microsoft.Maintenance.PostMaintenanceEvent . Webhooks utlöses avsiktligt på andra prenumerationshändelser om någon annan händelse läggs till med samma slutpunkt.

      param 
      
      (  
        [Parameter(Mandatory=$false)]  
      
        [object] $WebhookData  
      
      )  
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody  
      $eventType = $notificationPayload[0].eventType  
      
      if ($eventType -ne “Microsoft.Maintenance.PreMaintenanceEvent” -or $eventType –ne “Microsoft.Maintenance.PostMaintenanceEvent” ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
      return  
      } 
      
    2. Parametern SoftwareUpdateConfigurationRunContext , som innehåller information om listan över datorer i uppdateringsdistributionen, skickas inte till för- eller efterskripten när du använder dem för för- eller efterhändelser när du använder 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 resursdiagramfrågor
      • Se Rollen Virtual Machines-deltagare.
      • Se koden nedan:
    3. Se webhook-nyttolast

      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. Om du vill anpassa kan du använda antingen dina befintliga skript med ovanstående ändringar gjorda 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ägga till webhooks

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

Kommentar

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

Skapa en händelseprenumeration

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

  2. Under Hantera väljer du Datorer, Underhållskonfiguration.

  3. På sidan Underhållskonfiguration väljer du konfigurationen.

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

    Skärmbild som visar alternativen för att välja menyalternativet händelser.

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

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

  6. På sidan Skapa händelseprenumeration anger du följande information:

    1. I avsnittet Information om händelseprenumeration anger du ett lämpligt namn.
    2. Behåll schemat som Event Grid-schema.
    3. I avsnittet Händelsetyper filtrerar du till händelsetyper.
      1. Välj Förunderhållshändelse för en förhändelse.
        • I avsnittet Slutpunktsinformation väljer du Webhook-slutpunkten och väljer Konfigurera och Slutpunkt.
        • Ange lämplig information, till exempel webhook-URL :en före händelsen för att utlösa händelsen.
      2. Välj Efterunderhållshändelse för en efterhändelse.
        • I avsnittet Slutpunktsinformation väljer du Webhook-slutpunkten och konfigurerar och slutpunkten.
        • Ange lämplig information, till exempel webhooks-URL efter händelsen för att utlösa händelsen. Skärmbild som visar alternativen för att skapa händelseprenumerationerna.
  7. Välj Skapa.

Nästa steg

Lär dig mer om att hantera flera datorer.