Samouczek: tworzenie zdarzeń wstępnych i następujących 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
Upewnij się, że używasz elementu Runbook programu PowerShell 7.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
- 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
Zaloguj się do witryny Azure Portal i przejdź do konta usługi Azure Automation
Tworzenie i publikowanie elementu Runbook automatyzacji.
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.
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.
- Zobacz schemat zdarzeń usługi Azure Event Grid.
- Zobacz schemat usługi Event Grid specyficzny dla konfiguracji konserwacji
- Zobacz poniższy 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 }
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:
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 } }
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ń
Zaloguj się do witryny Azure Portal i przejdź do usługi Azure Update Manager.
W obszarze Zarządzanie wybierz pozycję Maszyny, Konfiguracja konserwacji.
Na stronie Konfiguracja konserwacji wybierz konfigurację.
W obszarze Ustawienia wybierz pozycję Zdarzenia.
Wybierz pozycję +Subskrypcja zdarzeń, aby utworzyć zdarzenie przed/po konserwacji.
Na stronie Tworzenie subskrypcji zdarzeń wprowadź następujące szczegóły:
- W sekcji Szczegóły subskrypcji zdarzeń podaj odpowiednią nazwę.
- Zachowaj schemat jako schemat usługi Event Grid.
- W sekcji Typy zdarzeń filtruj do typów zdarzeń.
- Wybierz pozycję Zdarzenie przed konserwacją dla zdarzenia przed zdarzeniem.
- W sekcji Szczegóły punktu końcowego wybierz punkt końcowy elementu webhook i wybierz pozycję Konfiguruj punkt końcowy.
- Podaj odpowiednie szczegóły, takie jak adres URL elementu webhook przed zdarzeniem, aby wyzwolić zdarzenie.
- Wybierz pozycję Po wystąpieniu zdarzenia konserwacji dla zdarzenia po zdarzeniu.
- Wybierz pozycję Zdarzenie przed konserwacją dla zdarzenia przed zdarzeniem.
Wybierz pozycję Utwórz.
Następne kroki
- Dowiedz się więcej na temat przeglądu zdarzeń wstępnych i ogłaszanych w usłudze Azure Update Manager.
- Dowiedz się więcej na temat tworzenia zdarzeń wstępnych i ogłaszanych
- Aby dowiedzieć się, jak zarządzać zdarzeniami wstępnymi i publikować je lub anulować przebieg harmonogramu, zobacz zdarzenia konfiguracji przed konserwacją i po nim.
- Dowiedz się więcej na temat tworzenia zdarzeń wstępnych i ogłaszanych przy użyciu usługi Azure Functions.