Aracılığıyla paylaş


Eğitim Dersi: Otomasyon runbook'ları ile webhook kullanarak bakım öncesi ve bakım sonrası etkinlikler oluşturma

Şunlar için geçerlidir: ✔️ Windows VM'leri ✔️ Linux VM'leri ✔️ Şirket içi ortam ✔️ Azure VM'leri ✔️ Azure Arc özellikli sunucular.

Zamanlanmış düzeltme eki yüklemeden önce ve sonra kullanıcı tanımlı eylemleri yürütmek için bakım öncesi ve bakım sonrası olayları kullanabilirsiniz. En yaygın senaryolardan biri, bir sanal makineyi (VM) başlatmak ve durdurmaktır. Zamanlanmış düzeltme uygulama sürecini başlatmadan önce, bakım öncesi olaylar aracılığıyla VM'yi başlatmak için bir betik çalıştırabilirsiniz. Planlanan düzeltme eki uygulama tamamlandıktan ve sunucu yeniden başlatıldıktan sonra VM'yi güvenli bir şekilde kapatmak için bir script çalıştırabilirsiniz.

Bu öğreticide, bir web kancası kullanarak zamanlanmış bir yama iş akışında VM'yi başlatmak ve durdurmak için bakım öncesi ve bakım sonrası olayların nasıl oluşturulacağı açıklanmaktadır.

Bu eğitimde, siz:

  • Azure Otomasyon Çalışma Kitapçığı'nı tasarlayın ve yayımlayın.
  • Webhook ekle.
  • Bir olay aboneliği oluştur.

Prerequisites

  1. PowerShell 7.4 runbook kullandığınızdan emin olun.

  2. uygun yönetilen kimliğe izinler atayın. Runbook, Otomasyon hesabının sistem tarafından atanan yönetilen kimliğini veya kullanıcı tarafından atanan yönetilen kimliği kullanabilir.

    Aşağıdaki betik örnekleri (VM'leri başlatma ve durdurma), Sanal Makine Katkıda Bulunanı rolünü veya bu belirli izinlere sahip özel bir rolü gerektirir:

    • Microsoft.Compute/sanalMakinalar/başlat/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/sanalMakineler/yeniBaşlat/eylem
    • Microsoft.Compute/virtualMachines/powerOff/action

    Her kimliğe izin atamak için Azure portalını veya Azure PowerShell cmdlet'lerini kullanabilirsiniz:

    İzinleri atamak için Azure portalını kullanarak Azure rolleri atama başlığındaki adımları izleyin.


  1. Az.ResourceGraph modülünü içe aktarın. Modülün 2.0.3 modül sürümüyle ThreadJob'a güncelleştirildiğinden emin olun.

Otomasyon çalışma kitabını oluşturma ve yayımlama

  1. Azure portalında oturum açın ve Azure Otomasyonu hesabınıza gidin.

  2. Otomasyon runbook'u oluştur ve yayınla.

  3. Azure Otomasyonu Güncelleştirme Yönetimi'nde bakım öncesi ve bakım sonrası görevler için runbook'ları kullandıysanız makineleriniz ve başarısız bakım çalıştırmaları üzerinde beklenmeyen bir etkiyi önlemek için aşağıdaki adımları kullanmanız önemlidir:

    1. Runbook'larınızın, yalnızca Microsoft.Maintenance.PreMaintenanceEvent veya Microsoft.Maintenance.PostMaintenanceEvent olaylarında tetiklendiğinden emin olmak için web kancası yükünü ayrıştırın. Tasarım gereği, aynı uç noktaya başka bir olay eklenirse web kancaları 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ğıdaki 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" -and $eventType –ne "Microsoft.Maintenance.PostMaintenanceEvent" ) {  
        Write-Output "Webhook not triggered as part of pre or post patching for maintenance run"  
        return  
        } 
        
    2. SoftwareUpdateConfigurationRunContext parametresi, güncelleştirme dağıtımındaki makine listeleri hakkında bilgi içerir. Otomasyon webhook kullanırken, bakım öncesi veya sonrası olaylar için betikleri kullandığınızda, bu bilgiler betiklere aktarılmayacaktır. Azure Kaynak Grafı'ndan makine listesini sorgulayabilir veya betiklerde kodlanmış makine listesini kullanabilirsiniz.

      • Betikte kullandığınız yönetilen kimliklere, Kaynak Grafı sorgularını yürütmek ve makineleri başlatmak veya durdurmak için uygun rollerin ve izinlerin verildiğinden emin olun.

      • Kaynak Grafı sorgularıyla ilgili izinlere bakın.

      • Bkz. Sanal Makine Katılımcısı rolü.

      • Bkz. webhook yükü.

      • Aşağıdaki koda bakın:

        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, önceki değişikliklerle 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

Önceki yayımlanan runbook'lara web kancaları ekleyin ve web kancası URL'lerini kopyalayın.

Note

Web kancası oluşturduktan sonra URL'yi kopyaladığınızdan emin olun. URL'yi yeniden alamazsınız.

Olay aboneliği oluşturma

  1. Azure portalda oturum açın ve Azure Güncelleme Yöneticisi'ne gidin.

  2. Yönet'in altında MakineBakım> seçin.

  3. Bakım Yapılandırması bölmesinde yapılandırmayı seçin.

  4. Ayarlar'ın altında Olaylar'ı seçin.

    Olaylar için menü seçeneğini gösteren ekran görüntüsü.

  5. Bakım öncesi veya bakım sonrası olay oluşturmak için +Olay Aboneliği'ne tıklayın.

    Olay aboneliklerini ve olay aboneliği oluşturma seçeneğini gösteren ekran görüntüsü.

  6. Olay Aboneliği Oluştur bölmesinin Olay Aboneliği Ayrıntıları bölümünde uygun bir ad belirtin. Şemayı Event Grid Şeması olarak tutun.

  7. Olay Türleri bölümünde, Olay Türlerine Filtre Uygula için Bakım Öncesi Olay veya BakımSonrası Olay'ı seçin.

  8. Uç Nokta Ayrıntıları bölümünde Web Kancası uç noktasını seçin ve ardından Uç nokta yapılandır'ı seçin.

  9. Olayı tetikleyen bakım öncesi veya bakım sonrası olayın web kancası URL'si gibi uygun ayrıntıları sağlayın.

    Olay abonelikleri oluşturma seçeneklerini gösteren ekran görüntüsü.

  10. Oluştur'i seçin.