Tutorial: Membuat peristiwa pra dan posting menggunakan webhook dengan Automation
Berlaku untuk: ✔️ VM Windows VM ✔️ ✔️ Linux Lingkungan ✔️ lokal Azure VM server ✔️ yang didukung Azure Arc.
Sebelum dan posting peristiwa, juga dikenal sebagai pra/pasca-skrip, memungkinkan Anda untuk menjalankan tindakan yang ditentukan pengguna sebelum dan sesudah penginstalan patch jadwal. Salah satu skenario yang paling umum adalah memulai dan menghentikan Komputer Virtual (VM). Dengan pra-peristiwa, Anda dapat menjalankan skrip pra-pengiriman untuk memulai VM sebelum memulai proses patching jadwal. Setelah patching jadwal selesai, dan server di-boot ulang, skrip pasca-patching dapat dijalankan untuk mematikan VM dengan aman.
Tutorial ini menjelaskan cara membuat peristiwa pra dan posting untuk memulai dan menghentikan VM dalam alur kerja patch jadwal menggunakan webhook.
Dalam tutorial ini, Anda akan mempelajari cara:
- Prasyarat
- Membuat dan menerbitkan runbook Automation
- Menambahkan webhook
- Membuat langganan peristiwa
Prasyarat
Pastikan Anda menggunakan runbook PowerShell 7.2 .
Tetapkan izin ke identitas terkelola - Anda dapat menetapkan izin ke identitas terkelola yang sesuai. Runbook dapat menggunakan identitas terkelola yang ditetapkan sistem akun Automation atau identitas terkelola yang ditetapkan pengguna.
Anda dapat menggunakan cmdlet portal atau PowerShell untuk menetapkan izin ke setiap identitas:
Ikuti langkah-langkah dalam Menetapkan peran Azure menggunakan portal Azure untuk menetapkan izin
Az.ResourceGraph
Impor modul, pastikan modul diperbarui ke ThreadJob dengan modul versi 2.0.3.
Membuat dan menerbitkan runbook Automation
Masuk ke portal Azure dan buka akun Azure Automation Anda
Membuat dan Menerbitkan runbook Automation.
Jika Anda menggunakan Runbook yang digunakan untuk tugas pra atau posting di Manajemen Pembaruan Azure Automation, sangat penting bagi Anda untuk mengikuti langkah-langkah di bawah ini untuk menghindari dampak tak terduga pada mesin Anda dan pemeliharaan yang gagal dijalankan.
Untuk runbook Anda, uraikan payload webhook untuk memastikan bahwa itu dipicu pada peristiwa Microsoft.Maintenance.PreMaintenanceEvent atau Microsoft.Maintenance.PostMaintenanceEvent saja. Berdasarkan webhook desain dipicu pada peristiwa langganan lain jika ada peristiwa lain yang ditambahkan dengan titik akhir yang sama.
- Lihat skema peristiwa Azure Event Grid.
- Lihat skema Event Grid khusus untuk konfigurasi Pemeliharaan
- Lihat kode yang tercantum di bawah ini:
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 , yang berisi informasi tentang daftar komputer dalam penyebaran pembaruan tidak akan diteruskan ke skrip pra atau pasca saat Anda menggunakannya untuk pra atau posting peristiwa saat menggunakan webhook otomatisasi. 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 grafik sumber daya
- Lihat Peran kontributor komputer virtual.
- Lihat kode yang tercantum di bawah ini:
Lihat payload 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 } }
Untuk menyesuaikan, Anda dapat menggunakan skrip yang ada dengan modifikasi di atas yang dilakukan atau menggunakan skrip berikut.
Skrip sampel
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
}
}
Menambahkan webhook
Tambahkan webhook ke runbook yang diterbitkan di atas dan salin URL webhook.
Catatan
Pastikan untuk menyalin URL setelah Anda membuat webhook karena Anda tidak dapat mengambil URL lagi.
Membuat langganan Peristiwa
Masuk ke portal Azure dan buka Azure Update Manager Anda.
Di bawah Kelola, pilih Mesin, Konfigurasi Pemeliharaan.
Pada halaman Konfigurasi Pemeliharaan, pilih konfigurasi.
Di bawah Pengaturan, pilih Peristiwa.
Pilih +Langganan Peristiwa untuk membuat peristiwa pemeliharaan pra/pasca pemeliharaan.
Pada halaman Buat Langganan Peristiwa, masukkan detail berikut ini:
- Di bagian Detail Langganan Peristiwa, berikan nama yang sesuai.
- Pertahankan skema sebagai Skema Event Grid.
- Di bagian Jenis Peristiwa, Filter ke Jenis Peristiwa.
- Pilih Peristiwa Pra-Pemeliharaan untuk pra-peristiwa.
- Di bagian Detail titik akhir, pilih titik akhir Webhook dan pilih Konfigurasikan Titik Akhir.
- Berikan detail yang sesuai seperti URL webhook pra-peristiwa untuk memicu peristiwa.
- Pilih Pasca Pemeliharaan Peristiwa untuk pasca-peristiwa.
- Pilih Peristiwa Pra-Pemeliharaan untuk pra-peristiwa.
Pilih Buat.
Langkah berikutnya
- Pelajari selengkapnya tentang gambaran umum peristiwa pra dan posting di Azure Update Manager.
- Pelajari selengkapnya tentang cara membuat peristiwa pra dan posting
- Untuk mempelajari cara mengelola peristiwa pra dan posting atau membatalkan eksekusi jadwal, lihat peristiwa konfigurasi pra dan pasca pemeliharaan.
- Pelajari selengkapnya tentang cara Membuat peristiwa pra dan posting menggunakan Azure Functions.