Kurz: Vytvoření události před a po nasazení pomocí webhooku s automatizací
Platí pro: ✔️ Virtuální ✔️ počítače s Windows s Linuxem ✔️ v místním prostředí ✔️ virtuálních počítačů Azure s ✔️ podporou Azure Arc.
Předběžné a následné události, označované také jako předzálohovací skripty, umožňují spouštět akce definované uživatelem před a po instalaci opravy plánu. Jedním z nejběžnějších scénářů je spuštění a zastavení virtuálního počítače. V případě předběžných událostí můžete před zahájením procesu oprav plánu spustit skript předběžného obnovení, který spustí virtuální počítač. Po dokončení opravy plánu a restartování serveru je možné spustit skript po opravě, který bezpečně vypne virtuální počítač.
Tento kurz vysvětluje, jak vytvořit události před a po spuštění a zastavení virtuálního počítače v pracovním postupu opravy plánu pomocí webhooku.
V tomto kurzu se naučíte:
- Požadavky
- Vytvoření a publikování runbooku Automation
- Přidání webhooků
- Vytvoření odběru událostí
Požadavky
Ujistěte se, že používáte runbook PowerShellu 7.2 .
Přiřaďte oprávnění spravovaným identitám – Oprávnění můžete přiřadit příslušné spravované identitě. Runbook může používat spravovanou identitu přiřazenou systémem účtu Automation nebo spravovanou identitu přiřazenou uživatelem.
K přiřazení oprávnění ke každé identitě můžete použít buď portál, nebo rutiny PowerShellu:
Přiřaďte oprávnění podle kroků v části Přiřazení rolí Azure pomocí webu Azure Portal .
- Importujte
Az.ResourceGraph
modul, ujistěte se, že se modul aktualizuje na ThreadJob s modulem verze 2.0.3.
Vytvoření a publikování runbooku Automation
Přihlaste se k webu Azure Portal a přejděte ke svému účtu Azure Automation .
Vytvoření a publikování runbooku Automation
Pokud jste používali runbooky, které se používaly pro předběžné nebo následné úlohy 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 neúspěšné spuštění údržby.
V případě runbooků parsujte datovou část webhooku a ujistěte se, že se spouští pouze u událostí Microsoft.Maintenance.PreMaintenanceEvent nebo Microsoft.Maintenance.PostMaintenanceEvent . Webhooky návrhu se aktivují u jiných událostí odběru, pokud se ke stejnému koncovému bodu přidá nějaká jiná událost.
- Podívejte se na schéma událostí Azure Event Gridu.
- Zobrazení schématu Event Gridu specifického pro konfigurace údržby
- Podívejte se na níže uvedený 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 }
Parametr SoftwareUpdateConfigurationRunContext , který obsahuje informace o seznamu počítačů v nasazení aktualizace, se při použití před nebo po spuštění událostí při použití webhooku automation nepředá do skriptů před nebo po něm. 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čů.
- Zobrazení oprávnění souvisejících s dotazy na grafy prostředků
- Viz role Přispěvatel virtuálních počítačů.
- Podívejte se na níže uvedený kód:
Zobrazit datovou část webhooku
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 stávající skripty s výše uvedený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 výše publikovaných runbooků a zkopírujte adresy URL webhooků.
Poznámka:
Po vytvoření webhooku nezapomeňte adresu URL zkopírovat, protože adresu URL už nemůžete znovu načíst.
Vytvoření odběru událostí
Přihlaste se k webu Azure Portal a přejděte na Azure Update Manager.
V části Spravovat vyberte Počítače, Konfigurace údržby.
Na stránce Konfigurace údržby vyberte konfiguraci.
V části Nastavení vyberte Události.
Výběrem možnosti +Odběr události vytvořte událost před údržbou nebo po dokončení údržby.
Na stránce Vytvořit odběr události zadejte následující podrobnosti:
- V části Podrobnosti odběru událostí zadejte odpovídající název.
- Ponechte schéma jako schéma Event Gridu.
- V části Typy událostí vyfiltrujte typy událostí.
- Vyberte událost před údržbou pro předběžnou událost.
- V části Podrobnosti o koncovém bodu vyberte koncový bod Webhooku a vyberte Konfigurovat koncový bod.
- Zadejte odpovídající podrobnosti, jako je adresa URL webhooku před událostí, která událost aktivuje.
- Vyberte událost po údržbě pro událost po události.
- Vyberte událost před údržbou pro předběžnou událost.
Vyberte Vytvořit.
Další kroky
- Přečtěte si další informace o přehledu událostí před a po publikování v Azure Update Manageru.
- Další informace o vytváření událostí před a po publikování
- Informace o správě událostí před a po odeslání nebo zrušení spuštění plánu najdete v tématu události konfigurace před a po dokončení údržby.
- Přečtěte si další informace o vytváření událostí před a po publikování pomocí Azure Functions.