Öğretici: Otomasyon ile web kancası kullanarak önceki ve sonraki olayları oluşturma
Şunlar için geçerlidir: ✔️ Windows VM'leri ✔️ Linux VM'leri ✔️ Şirket içi ortam ✔️ Azure VM'leri ✔️ Azure Arc özellikli sunucular.
Ön/son betik olarak da bilinen olaylar öncesi ve sonrası, zamanlama düzeltme eki yüklemeden önce ve sonra kullanıcı tanımlı eylemleri yürütmenize olanak tanır. En yaygın senaryolardan biri vm'yi başlatmak ve durdurmaktır. Ön olaylarla, zamanlama düzeltme eki uygulama işlemini başlatmadan önce VM'yi başlatmak için bir ön düzeltme eki uygulama betiği çalıştırabilirsiniz. Zamanlama düzeltme eki uygulama tamamlandıktan ve sunucu yeniden başlatıldıktan sonra, VM'yi güvenli bir şekilde kapatmak için bir düzeltme eki uygulama sonrası betiği yürütülebilir
Bu öğreticide, web kancası kullanarak bir zamanlama düzeltme eki iş akışında VM'yi başlatmak ve durdurmak için olayları önceden oluşturma ve gönderme açıklanmaktadır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Önkoşullar
- Otomasyon runbook'u oluşturma ve yayımlama
- Web kancaları ekleme
- Olay aboneliği oluşturma
Önkoşullar
PowerShell 7.2 runbook kullandığınızdan emin olun.
Yönetilen kimliklere izin atama - İzinleri uygun yönetilen kimliğe atayabilirsiniz. Runbook, Otomasyon hesabı sistem tarafından atanan yönetilen kimliği veya kullanıcı tarafından atanan yönetilen kimliği kullanabilir.
Her kimliğe izin atamak için portal veya PowerShell cmdlet'lerini kullanabilirsiniz:
- Azure portalı kullanarak
- Azure PowerShell’i kullanma
İzinleri atamak için Azure portalını kullanarak Azure rolleri atama başlığındaki adımları izleyin
- Modülü içeri aktarın
Az.ResourceGraph
, modülün 2.0.3 modülü sürümüyle ThreadJob'a güncelleştirildiğinden emin olun.
Otomasyon runbook'u oluşturma ve yayımlama
Azure portalında oturum açın ve Azure Otomasyonu hesabınıza gidin
Azure Otomasyonu Güncelleştirme Yönetimi'nde görevlerin öncesi veya sonrası için kullanılan Runbook'ları kullanıyorsanız, makineleriniz ve başarısız bakım çalıştırmaları üzerinde beklenmeyen bir etkiyi önlemek için aşağıdaki adımları izlemeniz kritik önem taşır.
Runbook'larınız için web kancası yükünü ayrıştırarak yalnızca Microsoft.Maintenance.PreMaintenanceEvent veya Microsoft.Maintenance.PostMaintenanceEvent olaylarında tetiklendiğinden emin olun. Tasarım gereği web kancaları, aynı uç noktaya başka bir olay eklenirse diğer abonelik olaylarında tetiklenir.
- Bkz. Azure Event Grid olay şeması.
- Bakım yapılandırmalarına özgü Event Grid şemasına bakın
- Aşağıda listelenen koda bakın:
param ( [Parameter(Mandatory=$false)] [object] $WebhookData ) $notificationPayload = ConvertFrom-Json -InputObject $WebhookData.RequestBody $eventType = $notificationPayload[0].eventType if ($eventType -ne “Microsoft.Maintenance.PreMaintenanceEvent” -or $eventType –ne “Microsoft.Maintenance.PostMaintenanceEvent” ) { Write-Output "Webhook not triggered as part of pre or post patching for maintenance run" return }
Güncelleştirme dağıtımındaki makinelerin listesi hakkında bilgi içeren SoftwareUpdateConfigurationRunContext parametresi, otomasyon web kancasını kullanırken bunları olaylar öncesi veya sonrası için kullandığınızda betiklere geçirilmeyecek veya gönderilmeyecektir. Azure Kaynak Grafı'daki makinelerin listesini sorgulayabilir veya betiklerde kodlanmış makine listesini kullanabilirsiniz.
- Betikte kullandığınız yönetilen kimliklere, Kaynak Grafı sorguları yürütmek ve makineleri başlatmak veya durdurmak için uygun rollerin ve izinlerin verildiğinden emin olun.
- Kaynak grafı sorguları ile ilgili izinlere bakın
- Bkz. Sanal makineler katkıda bulunan rolü.
- Aşağıda listelenen koda bakın:
Bkz. web kancası yükü
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 } }
Özelleştirmek için, yukarıdaki değişiklikleri yaptıktan sonra mevcut betiklerinizi kullanabilir veya aşağıdaki betikleri kullanabilirsiniz.
Örnek betikler
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
}
}
Web kancaları ekleme
Yukarıdaki yayımlanan runbook'lara web kancaları ekleyin ve web kancaları URL'lerini kopyalayın.
Not
Url'yi yeniden alamadığınızdan, web kancası oluşturduktan sonra URL'yi kopyaladığınızdan emin olun.
Olay aboneliği oluşturma
Azure portalında oturum açın ve Azure Update Manager'ınıza gidin.
Yönet'in altında Makineler, Bakım Yapılandırması'yı seçin.
Bakım Yapılandırması sayfasında yapılandırmayı seçin.
Ayarlar altında Olaylar'ı seçin.
Bakım öncesi/sonrası olayı oluşturmak için +Olay Aboneliği'ne tıklayın.
Olay Aboneliği Oluştur sayfasında aşağıdaki ayrıntıları girin:
- Olay Aboneliği Ayrıntıları bölümünde uygun bir ad girin.
- Şemayı Event Grid Şeması olarak tutun.
- Olay Türleri bölümünde, Olay Türlerine Filtre Uygula'yı seçin.
- Bir ön olay için Bakım Öncesi Olay'ı seçin.
- Uç nokta ayrıntıları bölümünde Web kancasıuç noktasını seçin ve Yapılandır ve Uç Nokta'yı seçin.
- Olayı tetikleme amacıyla olay öncesi web kancası URL'si gibi uygun ayrıntıları sağlayın.
- Olay sonrası için Bakım Sonrası Olay'ı seçin.
- Bir ön olay için Bakım Öncesi Olay'ı seçin.
Oluştur'u belirleyin.
Sonraki adımlar
Birden çok makineyi yönetme hakkında bilgi edinin.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin