Sdílet prostřednictvím


Kurz: Vytvoření události před a po nasazení pomocí webhooku s automatizací

Platí pro: ✔️ Virtuální ✔️ počítače s Windows s Linuxem ✔️ v místním prostředí ✔️ virtuálních počítačů Azure s ✔️ podporou Azure Arc.

Předběžné a následné události, označované také jako předzálohovací skripty, umožňují spouštět akce definované uživatelem před a po instalaci opravy plánu. Jedním z nejběžnějších scénářů je spuštění a zastavení virtuálního počítače. V případě předběžných událostí můžete před zahájením procesu oprav plánu spustit skript předběžného obnovení, který spustí virtuální počítač. Po dokončení opravy plánu a restartování serveru je možné spustit skript po opravě, který bezpečně vypne virtuální počítač.

Tento kurz vysvětluje, jak vytvořit události před a po spuštění a zastavení virtuálního počítače v pracovním postupu opravy plánu pomocí webhooku.

V tomto kurzu se naučíte:

  • Požadavky
  • Vytvoření a publikování runbooku Automation
  • Přidání webhooků
  • Vytvoření odběru událostí

Požadavky

  1. Ujistěte se, že používáte runbook PowerShellu 7.2 .

  2. Přiřaďte oprávnění spravovaným identitám – Oprávnění můžete přiřadit příslušné spravované identitě. Runbook může používat spravovanou identitu přiřazenou systémem účtu Automation nebo spravovanou identitu přiřazenou uživatelem.

    K přiřazení oprávnění ke každé identitě můžete použít buď portál, nebo rutiny PowerShellu:

    Přiřaďte oprávnění podle kroků v části Přiřazení rolí Azure pomocí webu Azure Portal .


  1. Importujte Az.ResourceGraph modul, ujistěte se, že se modul aktualizuje na ThreadJob s modulem verze 2.0.3.

Vytvoření a publikování runbooku Automation

  1. Přihlaste se k webu Azure Portal a přejděte ke svému účtu Azure Automation .

  2. Vytvoření a publikování runbooku Automation

  3. Pokud jste používali runbooky, které se používaly pro předběžné nebo následné úlohy ve službě Azure Automation Update Management, je důležité, abyste se vyhnuli neočekávanému dopadu na vaše počítače a neúspěšné spuštění údržby.

    1. V případě runbooků parsujte datovou část webhooku a ujistěte se, že se spouští pouze u událostí Microsoft.Maintenance.PreMaintenanceEvent nebo Microsoft.Maintenance.PostMaintenanceEvent . Webhooky návrhu se aktivují u jiných událostí odběru, pokud se ke stejnému koncovému bodu přidá nějaká jiná událost.

      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. Parametr SoftwareUpdateConfigurationRunContext , který obsahuje informace o seznamu počítačů v nasazení aktualizace, se při použití před nebo po spuštění událostí při použití webhooku automation nepředá do skriptů před nebo po něm. Můžete se dotazovat na seznam počítačů z Azure Resource Graphu nebo můžete mít seznam počítačů kódovaných ve skriptech.

      • Ujistěte se, že spravované identity, které používáte ve skriptu, mají udělené správné role a oprávnění ke spouštění nebo zastavování počítačů.
      • Zobrazení oprávnění souvisejících s dotazy na grafy prostředků
      • Viz role Přispěvatel virtuálních počítačů.
      • Podívejte se na níže uvedený kód:
    3. Zobrazit datovou část webhooku

      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. K přizpůsobení můžete použít stávající skripty s výše uvedenými úpravami nebo použít následující skripty.

Ukázkové skripty

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

Přidání webhooků

Přidejte webhooky do výše publikovaných runbooků a zkopírujte adresy URL webhooků.

Poznámka:

Po vytvoření webhooku nezapomeňte adresu URL zkopírovat, protože adresu URL už nemůžete znovu načíst.

Vytvoření odběru událostí

  1. Přihlaste se k webu Azure Portal a přejděte na Azure Update Manager.

  2. V části Spravovat vyberte Počítače, Konfigurace údržby.

  3. Na stránce Konfigurace údržby vyberte konfiguraci.

  4. V části Nastavení vyberte Události.

    Snímek obrazovky znázorňující možnosti pro výběr možnosti nabídky událostí

  5. Výběrem možnosti +Odběr události vytvořte událost před údržbou nebo po dokončení údržby.

    Snímek obrazovky znázorňující možnosti výběru odběrů událostí

  6. Na stránce Vytvořit odběr události zadejte následující podrobnosti:

    1. V části Podrobnosti odběru událostí zadejte odpovídající název.
    2. Ponechte schéma jako schéma Event Gridu.
    3. V části Typy událostí vyfiltrujte typy událostí.
      1. Vyberte událost před údržbou pro předběžnou událost.
        • V části Podrobnosti o koncovém bodu vyberte koncový bod Webhooku a vyberte Konfigurovat koncový bod.
        • Zadejte odpovídající podrobnosti, jako je adresa URL webhooku před událostí, která událost aktivuje.
      2. Vyberte událost po údržbě pro událost po události.
        • V části Podrobnosti o koncovém bodu vyberte koncový bod Webhooku a vyberte Konfigurovat koncový bod.
        • Zadejte odpovídající podrobnosti, jako je adresa URL webhooku po události, která událost aktivuje. Snímek obrazovky znázorňující možnosti vytvoření odběrů událostí
  7. Vyberte Vytvořit.

Další kroky