Aracılığıyla paylaş


Öğretici: Azure İşlevlerini kullanarak bakım öncesi ve bakım sonrası 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.

Bu öğreticide, Azure İşlevleri'ni kullanarak zamanlanmış bir yama iş akışında bir sanal makineyi (VM) başlatmak ve durdurmak için bakım öncesi ve bakım sonrası olayların nasıl oluşturulacağı açıklanır.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • İşlev uygulaması oluşturun.
  • İşlev oluşturma.
  • Bir olay aboneliği oluştur.

Önkoşullar

  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.

İşlev uygulaması oluşturma

  1. İşlev uygulaması oluşturmak için adımları izleyin.

  2. Aşağıdaki adımları kullanarak kaynağa gidin ve bağımlılıkları yükleyin.

    Not

    Bağımlılıkları yalnızca ilk kez yüklemeniz gerekir. PowerShell bağımlılıkları yüklenmiyorsa, Az ve Az.ResourceGraph öğelerinin en son sürümlerini kontrol edin.

    1. İşlev Uygulaması için Uygulama dosyaları'yı seçin.

    2. host.jsonaltında ManagedDependecy değerini True olarak ayarlayın ve requirements.psd1 dosyasını seçin.

    3. requirements.psd1 dosyasının altına aşağıdaki kodu yapıştırın:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Kaydet'i seçin.

  3. requirements.psd1 dosyasında belirtilen bağımlılıkları yüklemek için Genel Bakış sekmesinden işlev uygulamasını yeniden başlatın.

İşlev oluşturma

  1. İşlev uygulamasını oluşturduktan sonra kaynağa gidin, Genel Bakış'a gidin ve ardından Azure portalında oluştur'u seçin.

  2. İşlev oluştur bölmesinde aşağıdaki seçimleri yapın:

    1. Geliştirme ortamını seçin bölümündeGeliştirme ortamı için Portalda geliştir'i seçin.

    2. Şablon seç'in altında etkinlik ızgarası seçin.

    3. Şablon ayrıntıları'nın altında, Yeni İşlev için adı seçin. Ardından Oluştur'u seçin.

      İşlev oluşturmaya yönelik seçimleri gösteren ekran görüntüsü.

  3. Olay kılavuzu işlevi bölmesinde, soldaki menüden Code+Test'i seçin. Aşağıdaki kodu yapıştırın ve kaydet'i seçin.

    # Make sure that you're using eventGridEvent for parameter binding in the Azure function.
    param($eventGridEvent, $TriggerMetadata)
    
    Connect-AzAccount -Identity
    
    # Install the Resource Graph module from PowerShell Gallery
    # Install-Module -Name Az.ResourceGraph
    
    $maintenanceRunId = $eventGridEvent.data.CorrelationId
    $resourceSubscriptionIds = $eventGridEvent.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
        }
    }
    
  4. Sol menüde Tümleştirme'yi seçin. Tetikleyici için Olay Tetikleyicisi parametre adı değerini girin. Code+Test penceresinde verilen parametre adını kullanın. Örnekte parametresidir eventGridEvent.

    Olay tetikleyicisi için parametre adının girişini gösteren ekran görüntüsü.

  5. Kaydet'i seçin.

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.

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

  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 Azure İşlevi uç noktasını ve ardından Uç noktayı yapılandır'ı seçin.

  9. Olayı tetikleyen kaynak grubu ve işlev uygulaması gibi uygun ayrıntıları sağlayın.

  10. Oluştur'u belirleyin.

Olayları depolamak, göndermek ve almak için Azure Depolama hesaplarını ve olay hub'larını da kullanabilirsiniz. Daha fazla bilgi için Bkz. Azure Depolama'da kuyruk oluşturma ve Azure portalını kullanarak olay hub'ı oluşturma ile ilgili hızlı başlangıçlar.