Udostępnij za pomocą


Samouczek: Tworzenie zdarzeń przed rozpoczęciem konserwacji i po zakończeniu konserwacji przy użyciu webhook i Runbooks usługi Automation

Dotyczy: ✔️ Maszyny wirtualne z systemem Windows ✔️ Maszyny wirtualne z systemem Linux ✔️ Środowisko lokalne ✔️ Maszyny wirtualne platformy Azure ✔️ Serwery z obsługą Azure Arc.

Zdarzenia konserwacji wstępnej i po konserwacji umożliwiają wykonywanie akcji zdefiniowanych przez użytkownika przed zaplanowaną instalacją poprawek i po nim. Jednym z najbardziej typowych scenariuszy jest uruchomienie i zatrzymanie maszyny wirtualnej. W przypadku zdarzeń przed konserwacją można uruchomić skrypt, aby uruchomić maszynę wirtualną przed zainicjowaniem zaplanowanego procesu stosowania poprawek. Po zakończeniu zaplanowanego stosowania poprawek i ponownym uruchomieniu serwera można uruchomić skrypt, aby bezpiecznie zamknąć maszynę wirtualną.

W tym samouczku wyjaśniono, jak utworzyć zdarzenia konserwacji wstępnej i po konserwacji, aby uruchomić i zatrzymać maszynę wirtualną w zaplanowanym przepływie pracy poprawek przy użyciu elementu webhook.

W tym samouczku nauczysz się następujących rzeczy:

  • Utwórz i opublikuj runbooka usługi Azure Automation.
  • Dodaj elementy webhook.
  • Utwórz subskrypcję zdarzeń.

Wymagania wstępne

  1. Upewnij się, że używasz runbooka PowerShell 7.4.

  2. Przypisz uprawnienia do odpowiedniej tożsamości zarządzanej. Runbook może używać przypisanej przez system tożsamości zarządzanej konta Automation lub tożsamości zarządzanej przypisanej przez użytkownika.

    Następujące przykłady skryptów (uruchamianie i zatrzymywanie maszyn wirtualnych) wymagają roli Współautor maszyny wirtualnej lub roli niestandardowej z następującymi określonymi uprawnieniami:

    • Microsoft.Compute/maszynyWirtualne/start/akcja
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action (akcja)
    • Microsoft.Compute/virtualMachines/powerOff/action

    Aby przypisać uprawnienia do każdej tożsamości, możesz użyć witryny Azure Portal lub poleceń cmdlet programu Azure PowerShell:

    Aby przypisać uprawnienia, wykonaj kroki opisane w temacie Przypisywanie ról platformy Azure przy użyciu witryny Azure Portal.


  1. Zaimportuj Az.ResourceGraph moduł. Upewnij się, że moduł został zaktualizowany do wersji 2.0.3 modułu ThreadJob.

Utwórz i opublikuj runbook automatyzacji

  1. Zaloguj się do witryny Azure Portal i przejdź do swojego konta usługi Azure Automation .

  2. Utwórz i opublikuj Runbook usługi Automation.

  3. Jeśli używasz skryptów Runbook do zadań przed konserwacją i po konserwacji w usłudze Azure Automation Update Management, ważne jest, że zastosujesz poniższe kroki, aby uniknąć nieoczekiwanego wpływu na Twoje maszyny i niepowodzeń podczas konserwacji:

    1. W przypadku runbooków przeanalizuj ładunek webhooka, aby upewnić się, że jest on wyzwalany tylko dla zdarzeń Microsoft.Maintenance.PreMaintenanceEvent lub Microsoft.Maintenance.PostMaintenanceEvent. Zgodnie z projektem elementy webhook są wyzwalane na innych zdarzeniach subskrypcji, jeśli jakiekolwiek inne zdarzenie zostanie dodane z tym samym punktem końcowym.

      • Zobacz schemat zdarzeń usługi Azure Event Grid.

      • Zobacz schemat usługi Event Grid specyficzny dla konfiguracji konserwacji.

      • Zobacz następujący kod:

        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 zawiera informacje o listach maszyn we wdrożeniu aktualizacji. Nie zostanie ona przekazana do skryptów przy ich używaniu do zdarzeń przed lub po konserwacji podczas korzystania z webhooka usługi Automation. Możesz wykonać zapytanie dotyczące listy maszyn z usługi Azure Resource Graph lub wyświetlić listę maszyn zakodowanych w skryptach.

      • Upewnij się, że odpowiednie role i uprawnienia są przyznawane tożsamościom zarządzanym, których używasz w skrypcie, do wykonywania zapytań w usłudze Resource Graph oraz do uruchamiania lub zatrzymywania maszyn.

      • Zobacz uprawnienia związane z zapytaniami usługi Resource Graph.

      • Zobacz rolę Współtwórcy maszyny wirtualnej.

      • Zobacz ładunek webhooka.

      • Zobacz następujący kod:

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

Aby dostosować, możesz użyć istniejących skryptów z poprzednich modyfikacji lub użyć następujących skryptów.

Przykładowe skrypty

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

Dodawanie elementów webhook

Dodaj webhooks do poprzednio opublikowanych Runbooków i skopiuj adresy URL webhooków.

Uwaga

Pamiętaj, aby skopiować adres URL po utworzeniu webhooka. Nie można ponownie pobrać adresu URL.

Tworzenie subskrypcji zdarzeń

  1. Zaloguj się do witryny Azure Portal i przejdź do usługi Menedżer aktualizacji platformy Azure.

  2. W obszarze Zarządzanie wybierz pozycjęKonfiguracja konserwacji>.

  3. W okienku Konfiguracja konserwacji wybierz konfigurację.

  4. W obszarze Ustawienia wybierz pozycję Zdarzenia.

    Zrzut ekranu przedstawiający opcję menu dla wydarzeń.

  5. Wybierz +Subskrypcję zdarzeń, aby utworzyć zdarzenie przed lub po konserwacji.

    Zrzut ekranu przedstawiający subskrypcje zdarzeń z opcją tworzenia subskrypcji zdarzeń.

  6. W okienku Tworzenie subskrypcji zdarzeń w sekcji Szczegóły subskrypcji zdarzeń podaj odpowiednią nazwę. Zachowaj schemat jako schemat usługi Event Grid.

  7. W sekcji Typy zdarzeń w polu Filtruj do typów zdarzeń wybierz pozycję Zdarzenie przed konserwacją lub Zdarzenie po konserwacji.

  8. W sekcji Szczegóły punktu końcowego wybierz punkt końcowy webhook , a następnie wybierz pozycję Konfiguruj punkt końcowy.

  9. Podaj odpowiednie szczegóły, takie jak adres URL webhooka zdarzenia przed lub po konserwacji, aby wyzwolić zdarzenie.

    Zrzut ekranu przedstawiający opcje tworzenia subskrypcji zdarzeń.

  10. Wybierz pozycję Utwórz.