Sdílet prostřednictvím


Kurz: Vytváření událostí před údržbou a po údržbě pomocí webhooku s runbooky Automation

Platí pro: ✔️ Virtuální počítače s Windows ✔️ Virtuální počítače s Linuxem ✔️ Místní prostředí (on-premises) ✔️ Virtuální počítače Azure ✔️ Servery s podporou Azure Arc.

Události před údržbou a po údržbě můžete použít ke spouštění akcí definovaných uživatelem před a po plánované instalaci oprav. Jedním z nejběžnějších scénářů je spuštění a zastavení virtuálního počítače. Při událostech předběžné údržby můžete spustit skript, který spustí virtuální počítač před zahájením naplánovaného procesu oprav. Po dokončení plánovaných oprav a restartování serveru můžete spustit skript pro bezpečné vypnutí virtuálního počítače.

Tento kurz vysvětluje, jak pomocí webhooku vytvořit události předběžné údržby a po údržbě pro spuštění a zastavení virtuálního počítače v naplánovaném pracovním postupu oprav.

V tomto kurzu se naučíte:

  • Vytvořte a publikujte runbook pro Azure Automation.
  • Přidání webhooků
  • Vytvořte odběr události.

Požadavky

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

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

    Následující příklady skriptů (spouštění a zastavování virtuálních počítačů) vyžadují roli Přispěvatel virtuálních počítačů nebo vlastní roli s těmito konkrétními oprávněními:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/akce dokončení restartu
    • Microsoft.Compute/virtualMachines/powerOff/action

    K přiřazení oprávnění jednotlivým identitám můžete použít azure Portal nebo rutiny Azure PowerShellu:

    Pokud chcete přiřadit oprávnění, postupujte podle kroků v tématu Přiřazení rolí Azure pomocí webu Azure Portal.


  1. Importujte Az.ResourceGraph modul. Ujistěte se, že je modul aktualizovaný 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 runbooky používali pro úlohy před údržbou a po údržbě 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 selhání spuštění údržby:

    1. V případě vašich runbooků parsujte datovou část webhooku, abyste zajistili, že se aktivuje pouze u událostí Microsoft.Maintenance.PreMaintenanceEvent nebo Microsoft.Maintenance.PostMaintenanceEvent. Webhooky jsou navrženy tak, aby se aktivovaly při jiných událostech odběru, pokud je přidána jiná událost se stejným koncovým bodem.

      • Podívejte se na schéma událostí Azure Event Gridu.

      • Podívejte se na schéma Event Gridu specifické pro konfigurace údržby.

      • Podívejte se na následující kód:

        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 obsahuje informace o seznamech počítačů v nasazení aktualizace. Nebude předáno skriptům, když je použijete pro události před údržbou nebo po údržbě při použití webhooku Automation. 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čů.

      • Podívejte se na oprávnění související s dotazy Resource Graph.

      • Podívejte se na roli Přispěvatele virtuálního počítače.

      • Podívejte se na datovou část webhooku.

      • Podívejte se na následující kód:

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

K přizpůsobení můžete použít existující skripty s předchozí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 předchozích publikovaných runbooků a zkopírujte adresy URL těchto webhooků.

Poznámka:

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

Vytvoření odběru událostí

  1. Přihlaste se k webu Azure Portal a přejděte na Správce aktualizace Azure.

  2. V části Spravovat vyberteKonfigurace údržby>.

  3. V podokně Konfigurace údržby vyberte konfiguraci.

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

    Snímek obrazovky znázorňující možnost nabídky pro události

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

    Snímek obrazovky znázorňující odběry událostí s možností vytvoření odběru událostí

  6. V podokně Vytvořit odběr událostí zadejte v části Podrobnosti odběru událostí odpovídající název. Ponechte schéma jako schéma Event Gridu.

  7. V části Typy událostí v části Filtrovat podle typů událostí vyberte Událost před údržbou nebo Po dokončení údržby.

  8. V části Podrobnosti o koncovém bodu vyberte koncový bod webhooku a pak vyberte Konfigurovat koncový bod.

  9. Zadejte příslušné podrobnosti, například adresu URL webhooku události před údržbou nebo po údržbě, aby se událost aktivovala.

    Snímek obrazovky znázorňující možnosti vytváření odběrů událostí

  10. Vyberte Vytvořit.