Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: ✔️ VM Windows ✔️ VM Linux ✔️ Lingkungan di tempat ✔️ VM Azure ✔️ Server dengan Azure Arc diaktifkan.
Anda dapat menggunakan peristiwa pra-pemeliharaan dan pasca-pemeliharaan untuk menjalankan tindakan yang ditentukan pengguna sebelum dan sesudah penginstalan patch terjadwal. Salah satu skenario yang paling umum adalah memulai dan menghentikan komputer virtual (VM). Dengan peristiwa pra-pemeliharaan, Anda dapat menjalankan skrip untuk memulai VM sebelum memulai proses patching terjadwal. Setelah patching terjadwal selesai dan server di-boot ulang, Anda dapat menjalankan skrip untuk mematikan VM dengan aman.
Tutorial ini menjelaskan cara membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan untuk memulai dan menghentikan VM dalam alur kerja patch terjadwal dengan menggunakan webhook.
Di tutorial ini, Anda akan:
- Buat dan terbitkan runbook Azure Automation.
- Tambahkan webhook.
- Buat langganan acara.
Prasyarat
Pastikan Anda menggunakan runbook PowerShell 7.4 .
Tetapkan izin untuk identitas terkelola yang sesuai. Runbook dapat menggunakan identitas terkelola yang ditetapkan sistem pada akun Automation atau identitas terkelola yang ditetapkan pengguna.
Contoh skrip berikut (memulai dan menghentikan VM) memerlukan peran Kontributor Komputer Virtual atau peran kustom dengan izin khusus ini:
- Microsoft.Compute/virtualMachines/start/tindakan
- Microsoft.Compute/virtualMachines/deallocate/action
- Microsoft.Compute/virtualMachines/mulai ulang/tindakan
- Microsoft.Compute/virtualMachines/powerOff/action
Anda dapat menggunakan cmdlet portal Microsoft Azure atau Azure PowerShell untuk menetapkan izin ke setiap identitas:
Untuk menetapkan izin, ikuti langkah-langkah dalam Menetapkan peran Azure menggunakan portal Microsoft Azure.
- Impor modul
Az.ResourceGraph. Pastikan bahwa modul diperbarui ke ThreadJob dengan modul versi 2.0.3.
Membuat dan menerbitkan runbook Otomasi
Masuk ke portal Microsoft Azure dan buka akun Azure Automation Anda.
Membuat dan menerbitkan runbook Automasi.
Jika Anda menggunakan runbook untuk tugas pra-pemeliharaan dan pasca-pemeliharaan di Azure Automation Update Management, Anda harus menggunakan langkah-langkah berikut untuk menghindari dampak tak terduga pada komputer Anda dan pemeliharaan yang gagal dijalankan:
Untuk runbook Anda, urai payload webhook untuk memastikan bahwa itu hanya memicu pada peristiwa
Microsoft.Maintenance.PreMaintenanceEventatauMicrosoft.Maintenance.PostMaintenanceEvent. Secara desain, webhook dipicu pada peristiwa langganan lain jika ada peristiwa lain yang ditambahkan dengan titik akhir yang sama.Lihat skema acara Azure Event Grid.
Lihat skema Event Grid khusus untuk konfigurasi pemeliharaan.
Lihat kode berikut:
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 }
Parameter SoftwareUpdateConfigurationRunContext berisi informasi tentang daftar komputer dalam penyebaran pembaruan. Ini tidak akan diteruskan ke skrip saat Anda menggunakannya untuk peristiwa pra-pemeliharaan atau pasca-pemeliharaan saat menggunakan webhook Automation. Anda dapat mengkueri daftar komputer dari Azure Resource Graph atau membuat daftar komputer yang dikodekan dalam skrip.
Pastikan bahwa peran dan izin yang tepat diberikan ke identitas terkelola yang Anda gunakan dalam skrip, untuk menjalankan kueri Resource Graph dan untuk memulai atau menghentikan komputer.
Lihat izin yang terkait dengan kueri Resource Graph.
Lihat payload webhook.
Lihat kode berikut:
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 } }
Untuk menyesuaikan, Anda dapat menggunakan skrip yang sudah ada dengan modifikasi sebelumnya atau menggunakan skrip berikut.
Skrip contoh
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
}
}
Tambahkan webhook
Tambahkan webhook ke runbook yang diterbitkan sebelumnya dan salin URL webhook.
Catatan
Pastikan untuk menyalin URL setelah Anda membuat webhook. Anda tidak dapat mengambil URL lagi.
Membuat langganan peristiwa
Masuk ke portal Azure dan buka Manajer Pembaruan Azure.
Di bawah Kelola, pilihKonfigurasi Pemeliharaan>.
Pada panel Konfigurasi Pemeliharaan , pilih konfigurasi.
Di bawah Pengaturan, pilih Peristiwa.
Pilih +Langganan Acara untuk membuat acara sebelum pemeliharaan atau setelah pemeliharaan.
Pada panel Buat Langganan Peristiwa , di bagian Detail Langganan Peristiwa , berikan nama yang sesuai. Pertahankan skema sebagai Event Grid Schema.
Di bagian Jenis Peristiwa , untuk Filter ke Jenis Peristiwa, pilih Peristiwa Pra Pemeliharaan atau Peristiwa Pemeliharaan Pasca.
Di bagian Detail Titik Akhir , pilih titik akhir Web Hook , lalu pilih Konfigurasikan titik akhir.
Berikan detail yang sesuai, seperti URL webhook peristiwa pra-pemeliharaan atau pasca-pemeliharaan agar peristiwa dapat dipicu.
Pilih Buat.
Konten terkait
- Dapatkan gambaran umum peristiwa pra-pemeliharaan dan pasca-pemeliharaan di Azure Update Manager.
- Pelajari selengkapnya tentang cara membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan.
- Pelajari cara mengelola peristiwa pra-pemeliharaan dan pasca-pemeliharaan atau untuk membatalkan eksekusi terjadwal.
- Pelajari cara membuat peristiwa pra-pemeliharaan dan pasca-pemeliharaan dengan menggunakan Azure Functions.