Share via


Zelfstudie: pre- en postgebeurtenissen maken met een webhook met Automation

Van toepassing op: ✔️ Windows-VM's linux-VM's ✔️ ✔️ on-premises azure-VM's ✔️ ✔️ met Azure Arc-servers.

Voor- en postgebeurtenissen, ook wel pre-/postscripts genoemd, kunt u door de gebruiker gedefinieerde acties uitvoeren vóór en na de installatie van de planningspatch. Een van de meest voorkomende scenario's is het starten en stoppen van een virtuele machine (VM). Met pregebeurtenissen kunt u een prepatchingscript uitvoeren om de VIRTUELE machine te starten voordat u het patchproces voor planning start. Zodra de planningspatching is voltooid en de server opnieuw wordt opgestart, kan een script na de patch worden uitgevoerd om de virtuele machine veilig af te sluiten.

In deze zelfstudie wordt uitgelegd hoe u gebeurtenissen vooraf maakt en post om een VIRTUELE machine te starten en te stoppen in een werkstroom voor een planningspatch met behulp van een webhook.

In deze zelfstudie leert u het volgende:

  • Vereisten
  • Automation-runbook maken en publiceren
  • Webhooks toevoegen
  • Een gebeurtenisabonnement maken

Vereisten

  1. Zorg ervoor dat u powerShell 7.2-runbook gebruikt.

  2. Machtiging toewijzen aan beheerde identiteiten: u kunt machtigingen toewijzen aan de juiste beheerde identiteit. Het runbook kan de door het Automation-account toegewezen beheerde identiteit of een door de gebruiker toegewezen beheerde identiteit gebruiken.

    U kunt portal- of PowerShell-cmdlets gebruiken om machtigingen toe te wijzen aan elke identiteit:

    Volg de stappen in Azure-rollen toewijzen met behulp van Azure Portal om machtigingen toe te wijzen


  1. Importeer de Az.ResourceGraph module en zorg ervoor dat de module wordt bijgewerkt naar ThreadJob met moduleversie 2.0.3.

Automation-runbook maken en publiceren

  1. Meld u aan bij Azure Portal en ga naar uw Azure Automation-account

  2. Een Automation-runbook maken en publiceren .

  3. Als u Runbooks gebruikt die werden gebruikt voor pre- of posttaken in Azure Automation Updatebeheer, is het essentieel dat u de onderstaande stappen uitvoert om onverwachte gevolgen voor uw machines en mislukte onderhoudsuitvoeringen te voorkomen.

    1. Voor uw runbooks parseert u de nettolading van de webhook om ervoor te zorgen dat deze alleen wordt geactiveerd op Gebeurtenissen van Microsoft.Maintenance.PreMaintenanceEvent of Microsoft.Maintenance.PostMaintenanceEvent . Webhooks worden ontworpen voor andere abonnementsgebeurtenissen als er andere gebeurtenissen met hetzelfde eindpunt worden toegevoegd.

      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. De parameter SoftwareUpdateConfigurationRunContext , die informatie bevat over de lijst met machines in de update-implementatie, wordt niet doorgegeven aan de pre- of postscripts wanneer u deze gebruikt voor pre- of postgebeurtenissen tijdens het gebruik van automation-webhook. U kunt een query uitvoeren op de lijst met machines uit Azure Resource Graph of de lijst met computers die zijn gecodeerd in de scripts.

      • Zorg ervoor dat de juiste rollen en machtigingen worden verleend aan de beheerde identiteiten die u in het script gebruikt, om Resource Graph-query's uit te voeren en machines te starten of te stoppen.
      • Zie de machtigingen met betrekking tot resourcegrafiekquery's
      • Zie de rol Inzender voor virtuele machines.
      • Zie de onderstaande code:
    3. Zie de nettolading van de webhook

      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. Als u deze wilt aanpassen, kunt u uw bestaande scripts gebruiken met de bovenstaande wijzigingen of de volgende scripts gebruiken.

Voorbeeldscripts

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

Webhooks toevoegen

Voeg webhooks toe aan de bovenstaande gepubliceerde runbooks en kopieer de URL's van de webhooks.

Notitie

Zorg ervoor dat u de URL kopieert nadat u een webhook hebt gemaakt, omdat u de URL niet opnieuw kunt ophalen.

Een gebeurtenisabonnement maken

  1. Meld u aan bij Azure Portal en ga naar Azure Update Manager.

  2. Selecteer onder Beheren de optie Machines, Onderhoudsconfiguratie.

  3. Selecteer de configuratie op de pagina Onderhoudsconfiguratie .

  4. Selecteer onder Instellingen de optie Gebeurtenissen.

    Schermopname van de opties voor het selecteren van de menuoptie Gebeurtenissen.

  5. Selecteer +Gebeurtenisabonnement om een pre-/postonderhoudsgebeurtenis te maken.

    Schermopname van de opties voor het selecteren van de gebeurtenissenabonnementen.

  6. Voer op de pagina Gebeurtenisabonnement maken de volgende gegevens in:

    1. Geef in de sectie Details van gebeurtenisabonnement een geschikte naam op.
    2. Behoud het schema als Event Grid-schema.
    3. Filter op gebeurtenistypen in de sectie Gebeurtenistypen.
      1. Selecteer Pre-onderhoudsgebeurtenis voor een pregebeurtenis.
        • Selecteer in de sectie Eindpuntdetails het webhookeindpunt en selecteer Een eindpunt configureren.
        • Geef de juiste details op, zoals de URL van de webhook vóór de gebeurtenis, om de gebeurtenis te activeren.
      2. Selecteer Gebeurtenis na onderhoud voor een postgebeurtenis.
        • In de sectie Eindpuntdetails selecteert u het eindpunt van de webhook en selecteert u Een eindpunt configureren.
        • Geef de juiste gegevens op, zoals de URL van de webhook na de gebeurtenis, om de gebeurtenis te activeren. Schermopname van de opties voor het maken van de gebeurtenissenabonnementen.
  7. Selecteer Maken.

Volgende stappen