Udostępnij za pośrednictwem


Samouczek: tworzenie zdarzeń wstępnych i ogłaszanych (wersja zapoznawcza) przy użyciu elementu webhook z usługą Automation

Dotyczy: ✔️ Maszyny wirtualne z systemem Windows Maszyny ✔️ wirtualne z systemem Linux ✔️ w środowisku ✔️ lokalnym maszyn wirtualnych platformy Azure maszyn wirtualnych platformy ✔️ Azure z obsługą usługi Azure Arc.

Zdarzenia wstępne i ogłaszane, znane również jako skrypty wstępne/po nim, umożliwiają wykonywanie akcji zdefiniowanych przez użytkownika przed instalacją poprawek i po nim. Jednym z najbardziej typowych scenariuszy jest uruchomienie i zatrzymanie maszyny wirtualnej. W przypadku zdarzeń wstępnych można uruchomić skrypt wstępny, aby uruchomić maszynę wirtualną przed zainicjowaniem procesu stosowania poprawek harmonogramu. Po zakończeniu stosowania poprawek harmonogramu i ponownym uruchomieniu serwera można wykonać skrypt po poprawkach, aby bezpiecznie zamknąć maszynę wirtualną.

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

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Wymagania wstępne
  • Tworzenie i publikowanie elementu Runbook usługi Automation
  • Dodawanie elementów webhook
  • Tworzenie subskrypcji zdarzeń

Wymagania wstępne

  1. Upewnij się, że używasz elementu Runbook programu PowerShell 7.2 .

  2. Przypisywanie uprawnień do tożsamości zarządzanych — możesz przypisać uprawnienia do odpowiedniej tożsamości zarządzanej. Element Runbook może używać przypisanej przez system tożsamości zarządzanej konta usługi Automation lub tożsamości zarządzanej przypisanej przez użytkownika.

    Do przypisywania uprawnień do każdej tożsamości można użyć portalu lub poleceń cmdlet programu PowerShell:

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


  1. Zaimportuj Az.ResourceGraph moduł, upewnij się, że moduł został zaktualizowany do zadania ThreadJob przy użyciu modułu w wersji 2.0.3.

Tworzenie i publikowanie elementu Runbook usługi Automation

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

  2. Tworzenie i publikowanie elementu Runbook automatyzacji.

  3. Jeśli używasz elementów Runbook, które były używane do zadań wstępnych lub wykonywanych po nich w usłudze Azure Automation Update Management, należy wykonać poniższe kroki, aby uniknąć nieoczekiwanego wpływu na maszyny i nieudanych przebiegów konserwacji.

    1. W przypadku elementów Runbook przeanalizuj ładunek elementu webhook, aby upewnić się, że wyzwala on tylko zdarzenia Microsoft.Maintenance.PreMaintenanceEvent lub Microsoft.Maintenance.PostMaintenanceEvent . Według projektu elementy webhook są wyzwalane na innych zdarzeniach subskrypcji, jeśli jakiekolwiek inne zdarzenie zostanie dodane z tym samym punktem końcowym.

      param 
      
      (  
        [Parameter(Mandatory=$false)]  
      
        [object] $WebhookData  
      
      )  
      $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody  
      $eventType = $notificationPayload[0].eventType  
      
      if ($eventType -ne “Microsoft.Maintenance.PreMaintenanceEvent” -or $eventType –ne “Microsoft.Maintenance.PostMaintenanceEvent” ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
      return  
      } 
      
    2. SoftwareUpdateConfigurationRunContext parametr, który zawiera informacje o liście maszyn we wdrożeniu aktualizacji nie zostanie przekazany do skryptów wstępnych ani ogłaszanych podczas korzystania z elementu webhook automatyzacji. 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 skrytecie, do wykonywania zapytań usługi Resource Graph i uruchamiania lub zatrzymywania maszyn.
      • Wyświetlanie uprawnień związanych z zapytaniami grafu zasobów
      • Zobacz Rola współautora maszyn wirtualnych.
      • Zobacz poniższy kod:
    3. Zobacz ładunek elementu 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. Aby dostosować, możesz użyć istniejących skryptów z powyższymi modyfikacjami 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 elementy webhook do powyższych opublikowanych elementów Runbook i skopiuj adresy URL elementów webhook.

Uwaga

Pamiętaj, aby skopiować adres URL po utworzeniu elementu webhook, ponieważ nie można ponownie pobrać adresu URL.

Tworzenie subskrypcji zdarzeń

  1. Zaloguj się do witryny Azure Portal i przejdź do usługi Azure Update Manager.

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

  3. Na stronie Konfiguracja konserwacji wybierz konfigurację.

  4. W obszarze Ustawienia wybierz pozycję Zdarzenia.

    Zrzut ekranu przedstawiający opcje wybierania opcji menu zdarzeń.

  5. Wybierz pozycję +Subskrypcja zdarzeń, aby utworzyć zdarzenie przed/po konserwacji.

    Zrzut ekranu przedstawiający opcje wybierania subskrypcji zdarzeń.

  6. Na stronie Tworzenie subskrypcji zdarzeń wprowadź następujące szczegóły:

    1. W sekcji Szczegóły subskrypcji zdarzeń podaj odpowiednią nazwę.
    2. Zachowaj schemat jako schemat usługi Event Grid.
    3. W sekcji Typy zdarzeń filtruj do typów zdarzeń.
      1. Wybierz pozycję Zdarzenie przed konserwacją dla zdarzenia przed zdarzeniem.
        • W sekcji Szczegóły punktu końcowego wybierz punkt końcowy elementu webhook, a następnie wybierz pozycję Konfiguruj i punkt końcowy.
        • Podaj odpowiednie szczegóły, takie jak adres URL elementu webhook przed zdarzeniem, aby wyzwolić zdarzenie.
      2. Wybierz pozycję Po wystąpieniu zdarzenia konserwacji dla zdarzenia po zdarzeniu.
        • W sekcji Szczegóły punktu końcowego punkt końcowy elementu webhook wybierz pozycję Konfiguruj i punkt końcowy.
        • Podaj odpowiednie szczegóły, takie jak adres URL elementu webhook po zdarzeniu, aby wyzwolić zdarzenie. Zrzut ekranu przedstawiający opcje tworzenia subskrypcji zdarzeń.
  7. Wybierz pozycję Utwórz.

Następne kroki