Oktatóanyag: Karbantartás előtti és utáni események létrehozása webhook használatával Automation-runbookokkal

A következőkre vonatkozik: ✔️ Windows rendszerű virtuális ✔️ gépek Linux ✔️ rendszerű virtuális gépek helyszíni környezete ✔️ Azure-beli ✔️ virtuális gépek Azure Arc-kompatibilis kiszolgálókra.

A karbantartás előtti és a karbantartás utáni események segítségével felhasználó által meghatározott műveleteket hajthat végre az ütemezett javítás telepítése előtt és után. Az egyik leggyakoribb forgatókönyv egy virtuális gép (VM) indítása és leállítása. A karbantartás előtti eseményeknél futtathat egy szkriptet a virtuális gép elindításához, mielőtt elindítja az ütemezett javítási folyamatot. Miután az ütemezett javítás befejeződött, és a kiszolgáló újraindult, futtathat egy szkriptet a virtuális gép biztonságos leállításához.

Ez az oktatóanyag bemutatja, hogyan hozhat létre karbantartás előtti és utáni eseményeket a virtuális gépek ütemezett javítási munkafolyamatban való elindításához és leállításához egy webhook használatával.

Ebben az útmutatóban Ön:

  • Azure Automation-runbook létrehozása és közzététele.
  • Webhookok hozzáadása.
  • Hozzon létre egy esemény-előfizetést.

Előfeltételek

  1. Ellenőrizze, hogy PowerShell 7.4 runbookot használ.

  2. Engedélyek hozzárendelése a megfelelő felügyelt identitáshoz. A runbook használhatja az Automation-fiók által a rendszernek hozzárendelt felügyelt identitást vagy a felhasználó által hozzárendelt felügyelt identitást.

    A következő példaszkriptekhez (virtuális gépek indításához és leállításához) virtuálisgép-közreműködői szerepkörre vagy egyéni szerepkörre van szükség az alábbi engedélyekkel:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action
    • Microsoft.Compute/virtualMachines/powerOff/action

    Az Azure Portalon vagy az Azure PowerShell-parancsmagokkal engedélyeket rendelhet az egyes identitásokhoz:

    Az engedélyek hozzárendeléséhez kövesse az Azure-szerepkörök hozzárendelése az Azure Portal használatával című témakörben leírt lépéseket.


  1. Importálja a modult Az.ResourceGraph . Győződjön meg arról, hogy a modul a ThreadJob 2.0.3-s verziójával frissül.

Automatizálási kézikönyv létrehozása és közzététele

  1. Jelentkezzen be az Azure Portalra , és lépjen az Azure Automation-fiókjába .

  2. Automation-runbook létrehozása és közzététele.

  3. Ha runbookokat használt az Azure Automation Update Management elő- és utókarbantartási feladataihoz , az alábbi lépésekkel elkerülheti a gépek váratlan hatását és a sikertelen karbantartási futtatásokat:

    1. A runbookok esetében elemezze a webhook hasznos adatait, hogy meggyőződjön arról, hogy csak Microsoft.Maintenance.PreMaintenanceEvent vagy Microsoft.Maintenance.PostMaintenanceEvent eseményekre aktiválódik. A webhookok tervezés szerint más előfizetési eseményeken aktiválódnak, ha bármely más eseményt ugyanazzal a végponttal adnak hozzá.

      • Tekintse meg az Azure Event Grid eseménysémát.

      • Tekintse meg a karbantartási konfigurációkra vonatkozó Event Grid-sémát.

      • Lásd a következő kódot:

        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. A SoftwareUpdateConfigurationRunContext paraméter információkat tartalmaz a frissítéstelepítésben lévő gépek listájáról. Nem lesz átadva a szkripteknek, amikor előkarbantartási vagy utókarbantartási eseményekre használja őket egy Automation-webhook használata közben. Lekérdezheti a gépek listáját az Azure Resource Graph-ból, vagy a szkriptekben kódolt gépek listáját.

      • Győződjön meg arról, hogy megfelelő szerepkörök és engedélyek vannak megadva a szkriptben használt felügyelt identitásokhoz, a Resource Graph-lekérdezések végrehajtásához, valamint a gépek elindításához vagy leállításához.

      • Tekintse meg a Resource Graph-lekérdezésekhez kapcsolódó engedélyeket.

      • Tekintse meg a virtuálisgép-közreműködői szerepkört.

      • Tekintse meg a webhook terheltségét.

      • Lásd a következő kódot:

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

A testreszabáshoz használhatja a meglévő szkripteket az előző módosításokkal, vagy használhatja a következő szkripteket.

Mintaszkriptek

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

Webhookok hozzáadása

Adjon hozzá webhookokat az előzőleg publikált runbookokhoz, és másolja a webhook URL-címeit.

Feljegyzés

A webhook létrehozása után mindenképpen másolja az URL-címet. Az URL-címet nem lehet újból lekérni.

Esemény-előfizetés létrehozása

  1. Jelentkezzen be az Azure portálra, és lépjen az Azure frissítéskezelőbe.

  2. A Kezelés területen válassza a Gépek>karbantartási konfigurációja lehetőséget.

  3. A Karbantartási konfiguráció panelen válassza ki a konfigurációt.

  4. A Beállítások területen válassza az Események lehetőséget.

    Képernyőkép az események menübeállításról.

  5. Az +Esemény-előfizetés lehetőséget választva előkarbantartást vagy karbantartás utáni eseményt hozhat létre.

    Az esemény-előfizetéseket bemutató képernyőkép, amelyen lehetőség van egy esemény-előfizetés létrehozására.

  6. Az Esemény-előfizetés létrehozása panel Esemény-előfizetés részletei szakaszában adjon meg egy megfelelő nevet. Tartsa a sémát Event Grid-sémaként.

  7. Az Eseménytípusok szakaszban a Szűrés eseménytípusok között válassza a Karbantartás előtti esemény vagy a Karbantartás utáni esemény lehetőséget.

  8. A Végpont részletei szakaszban válassza ki a Web Hook végpontot, majd válassza a Végpont konfigurálása lehetőséget.

  9. Adja meg a megfelelő adatokat, például a karbantartás előtti vagy a karbantartás utáni esemény webhook URL-címét az esemény aktiválásához.

    Képernyőkép az esemény-előfizetések létrehozásának lehetőségeiről.

  10. Válassza a Létrehozás lehetőséget.