Zelfstudie: pre- en postgebeurtenissen maken met een webhook met Automation
Van toepassing op: ✔️ Windows-VM's linux-VM's ✔️ ✔️ on-premises azure-VM's ✔️ ✔️ met Azure Arc-servers.
Voor- en postgebeurtenissen, ook wel pre-/postscripts genoemd, kunt u door de gebruiker gedefinieerde acties uitvoeren vóór en na de installatie van de planningspatch. Een van de meest voorkomende scenario's is het starten en stoppen van een virtuele machine (VM). Met pregebeurtenissen kunt u een prepatchingscript uitvoeren om de VIRTUELE machine te starten voordat u het patchproces voor planning start. Zodra de planningspatching is voltooid en de server opnieuw wordt opgestart, kan een script na de patch worden uitgevoerd om de virtuele machine veilig af te sluiten.
In deze zelfstudie wordt uitgelegd hoe u gebeurtenissen vooraf maakt en post om een VIRTUELE machine te starten en te stoppen in een werkstroom voor een planningspatch met behulp van een webhook.
In deze zelfstudie leert u het volgende:
- Vereisten
- Automation-runbook maken en publiceren
- Webhooks toevoegen
- Een gebeurtenisabonnement maken
Vereisten
Zorg ervoor dat u powerShell 7.2-runbook gebruikt.
Machtiging toewijzen aan beheerde identiteiten: u kunt machtigingen toewijzen aan de juiste beheerde identiteit. Het runbook kan de door het Automation-account toegewezen beheerde identiteit of een door de gebruiker toegewezen beheerde identiteit gebruiken.
U kunt portal- of PowerShell-cmdlets gebruiken om machtigingen toe te wijzen aan elke identiteit:
Volg de stappen in Azure-rollen toewijzen met behulp van Azure Portal om machtigingen toe te wijzen
- Importeer de
Az.ResourceGraph
module en zorg ervoor dat de module wordt bijgewerkt naar ThreadJob met moduleversie 2.0.3.
Automation-runbook maken en publiceren
Meld u aan bij Azure Portal en ga naar uw Azure Automation-account
Als u Runbooks gebruikt die werden gebruikt voor pre- of posttaken in Azure Automation Updatebeheer, is het essentieel dat u de onderstaande stappen uitvoert om onverwachte gevolgen voor uw machines en mislukte onderhoudsuitvoeringen te voorkomen.
Voor uw runbooks parseert u de nettolading van de webhook om ervoor te zorgen dat deze alleen wordt geactiveerd op Gebeurtenissen van Microsoft.Maintenance.PreMaintenanceEvent of Microsoft.Maintenance.PostMaintenanceEvent . Webhooks worden ontworpen voor andere abonnementsgebeurtenissen als er andere gebeurtenissen met hetzelfde eindpunt worden toegevoegd.
- Zie het Azure Event Grid-gebeurtenisschema.
- Zie het Event Grid-schema dat specifiek is voor onderhoudsconfiguraties
- Zie de onderstaande code:
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 }
De parameter SoftwareUpdateConfigurationRunContext , die informatie bevat over de lijst met machines in de update-implementatie, wordt niet doorgegeven aan de pre- of postscripts wanneer u deze gebruikt voor pre- of postgebeurtenissen tijdens het gebruik van automation-webhook. U kunt een query uitvoeren op de lijst met machines uit Azure Resource Graph of de lijst met computers die zijn gecodeerd in de scripts.
- Zorg ervoor dat de juiste rollen en machtigingen worden verleend aan de beheerde identiteiten die u in het script gebruikt, om Resource Graph-query's uit te voeren en machines te starten of te stoppen.
- Zie de machtigingen met betrekking tot resourcegrafiekquery's
- Zie de rol Inzender voor virtuele machines.
- Zie de onderstaande code:
Zie de nettolading van de 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 } }
Als u deze wilt aanpassen, kunt u uw bestaande scripts gebruiken met de bovenstaande wijzigingen of de volgende scripts gebruiken.
Voorbeeldscripts
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
}
}
Webhooks toevoegen
Voeg webhooks toe aan de bovenstaande gepubliceerde runbooks en kopieer de URL's van de webhooks.
Notitie
Zorg ervoor dat u de URL kopieert nadat u een webhook hebt gemaakt, omdat u de URL niet opnieuw kunt ophalen.
Een gebeurtenisabonnement maken
Meld u aan bij Azure Portal en ga naar Azure Update Manager.
Selecteer onder Beheren de optie Machines, Onderhoudsconfiguratie.
Selecteer de configuratie op de pagina Onderhoudsconfiguratie .
Selecteer onder Instellingen de optie Gebeurtenissen.
Selecteer +Gebeurtenisabonnement om een pre-/postonderhoudsgebeurtenis te maken.
Voer op de pagina Gebeurtenisabonnement maken de volgende gegevens in:
- Geef in de sectie Details van gebeurtenisabonnement een geschikte naam op.
- Behoud het schema als Event Grid-schema.
- Filter op gebeurtenistypen in de sectie Gebeurtenistypen.
- Selecteer Pre-onderhoudsgebeurtenis voor een pregebeurtenis.
- Selecteer in de sectie Eindpuntdetails het webhookeindpunt en selecteer Een eindpunt configureren.
- Geef de juiste details op, zoals de URL van de webhook vóór de gebeurtenis, om de gebeurtenis te activeren.
- Selecteer Gebeurtenis na onderhoud voor een postgebeurtenis.
- Selecteer Pre-onderhoudsgebeurtenis voor een pregebeurtenis.
Selecteer Maken.
Volgende stappen
- Meer informatie over het overzicht van pre- en postgebeurtenissen in Azure Update Manager.
- Meer informatie over het maken van pre- en postgebeurtenissen
- Voor meer informatie over het beheren van pre- en postgebeurtenissen of het annuleren van een planningsuitvoering, raadpleegt u pre- en post-onderhoudsconfiguratiegebeurtenissen.
- Meer informatie over het maken van pre- en postgebeurtenissen met behulp van Azure Functions.