Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: ✔️ Windows rendszerű virtuális ✔️ gépek Linux ✔️ rendszerű virtuális gépek helyszíni környezete ✔️ Azure-beli ✔️ virtuális gépek Azure Arc-kompatibilis kiszolgálókra.
A karbantartás előtti és a karbantartás utáni események segítségével felhasználó által meghatározott műveleteket hajthat végre az ütemezett javítás telepítése előtt és után. Az egyik leggyakoribb forgatókönyv egy virtuális gép (VM) indítása és leállítása. A karbantartás előtti eseményeknél futtathat egy szkriptet a virtuális gép elindításához, mielőtt elindítja az ütemezett javítási folyamatot. Miután az ütemezett javítás befejeződött, és a kiszolgáló újraindult, futtathat egy szkriptet a virtuális gép biztonságos leállításához.
Ez az oktatóanyag bemutatja, hogyan hozhat létre karbantartás előtti és utáni eseményeket a virtuális gépek ütemezett javítási munkafolyamatban való elindításához és leállításához egy webhook használatával.
Ebben az útmutatóban Ön:
- Azure Automation-runbook létrehozása és közzététele.
- Webhookok hozzáadása.
- Hozzon létre egy esemény-előfizetést.
Előfeltételek
Ellenőrizze, hogy PowerShell 7.4 runbookot használ.
Engedélyek hozzárendelése a megfelelő felügyelt identitáshoz. A runbook használhatja az Automation-fiók által a rendszernek hozzárendelt felügyelt identitást vagy a felhasználó által hozzárendelt felügyelt identitást.
A következő példaszkriptekhez (virtuális gépek indításához és leállításához) virtuálisgép-közreműködői szerepkörre vagy egyéni szerepkörre van szükség az alábbi engedélyekkel:
- Microsoft.Compute/virtualMachines/start/action
- Microsoft.Compute/virtualMachines/deallocate/action
- Microsoft.Compute/virtualMachines/restart/action
- Microsoft.Compute/virtualMachines/powerOff/action
Az Azure Portalon vagy az Azure PowerShell-parancsmagokkal engedélyeket rendelhet az egyes identitásokhoz:
Az engedélyek hozzárendeléséhez kövesse az Azure-szerepkörök hozzárendelése az Azure Portal használatával című témakörben leírt lépéseket.
- Importálja a modult
Az.ResourceGraph. Győződjön meg arról, hogy a modul a ThreadJob 2.0.3-s verziójával frissül.
Automatizálási kézikönyv létrehozása és közzététele
Jelentkezzen be az Azure Portalra , és lépjen az Azure Automation-fiókjába .
Automation-runbook létrehozása és közzététele.
Ha runbookokat használt az Azure Automation Update Management elő- és utókarbantartási feladataihoz , az alábbi lépésekkel elkerülheti a gépek váratlan hatását és a sikertelen karbantartási futtatásokat:
A runbookok esetében elemezze a webhook hasznos adatait, hogy meggyőződjön arról, hogy csak
Microsoft.Maintenance.PreMaintenanceEventvagyMicrosoft.Maintenance.PostMaintenanceEventeseményekre aktiválódik. A webhookok tervezés szerint más előfizetési eseményeken aktiválódnak, ha bármely más eseményt ugyanazzal a végponttal adnak hozzá.Tekintse meg az Azure Event Grid eseménysémát.
Tekintse meg a karbantartási konfigurációkra vonatkozó Event Grid-sémát.
Lásd a következő kódot:
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 }
A SoftwareUpdateConfigurationRunContext paraméter információkat tartalmaz a frissítéstelepítésben lévő gépek listájáról. Nem lesz átadva a szkripteknek, amikor előkarbantartási vagy utókarbantartási eseményekre használja őket egy Automation-webhook használata közben. Lekérdezheti a gépek listáját az Azure Resource Graph-ból, vagy a szkriptekben kódolt gépek listáját.
Győződjön meg arról, hogy megfelelő szerepkörök és engedélyek vannak megadva a szkriptben használt felügyelt identitásokhoz, a Resource Graph-lekérdezések végrehajtásához, valamint a gépek elindításához vagy leállításához.
Tekintse meg a Resource Graph-lekérdezésekhez kapcsolódó engedélyeket.
Tekintse meg a virtuálisgép-közreműködői szerepkört.
Tekintse meg a webhook terheltségét.
Lásd a következő kódot:
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 } }
A testreszabáshoz használhatja a meglévő szkripteket az előző módosításokkal, vagy használhatja a következő szkripteket.
Mintaszkriptek
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
}
}
Webhookok hozzáadása
Adjon hozzá webhookokat az előzőleg publikált runbookokhoz, és másolja a webhook URL-címeit.
Feljegyzés
A webhook létrehozása után mindenképpen másolja az URL-címet. Az URL-címet nem lehet újból lekérni.
Esemény-előfizetés létrehozása
Jelentkezzen be az Azure portálra, és lépjen az Azure frissítéskezelőbe.
A Kezelés területen válassza a Gépek>karbantartási konfigurációja lehetőséget.
A Karbantartási konfiguráció panelen válassza ki a konfigurációt.
A Beállítások területen válassza az Események lehetőséget.
Az +Esemény-előfizetés lehetőséget választva előkarbantartást vagy karbantartás utáni eseményt hozhat létre.
Az Esemény-előfizetés létrehozása panel Esemény-előfizetés részletei szakaszában adjon meg egy megfelelő nevet. Tartsa a sémát Event Grid-sémaként.
Az Eseménytípusok szakaszban a Szűrés eseménytípusok között válassza a Karbantartás előtti esemény vagy a Karbantartás utáni esemény lehetőséget.
A Végpont részletei szakaszban válassza ki a Web Hook végpontot, majd válassza a Végpont konfigurálása lehetőséget.
Adja meg a megfelelő adatokat, például a karbantartás előtti vagy a karbantartás utáni esemény webhook URL-címét az esemény aktiválásához.
Válassza a Létrehozás lehetőséget.
Kapcsolódó tartalom
- Áttekintést kaphat a karbantartás előtti és a karbantartás utáni eseményekről az Azure Update Managerben.
- További információ a karbantartás előtti és a karbantartás utáni események létrehozásáról.
- Megtudhatja, hogyan kezelheti az előkarbantartást és a karbantartás utáni eseményeket, illetve hogyan szakíthat meg ütemezett futtatásokat.
- Megtudhatja, hogyan hozhat létre karbantartás előtti és utáni eseményeket az Azure Functions használatával.