Sdílet prostřednictvím


Kurz: Vytváření událostí před údržbou a po údržbě pomocí Azure Functions

Platí pro: ✔️ Virtuální ✔️ počítače s Windows s Linuxem ✔️ v místním prostředí ✔️ virtuálních počítačů Azure s ✔️ podporou Azure Arc.

V tomto kurzu se dozvíte, jak vytvořit události předběžné údržby a po údržbě pro spuštění a zastavení virtuálního počítače v naplánovaném pracovním postupu oprav pomocí Azure Functions.

V tomto kurzu se naučíte:

  • Vytvořte aplikaci funkcí.
  • Vytvoření funkce
  • Vytvořte odběr události.

Požadavky

  1. Ujistěte se, že používáte runbook verze PowerShellu 7.4.

  2. Přiřaďte oprávnění příslušné spravované identitě. Runbook může používat systémem přiřazenou spravovanou identitu účtu Automation nebo spravovanou identitu přiřazenou uživatelem.

    Následující příklady skriptů (spouštění a zastavování virtuálních počítačů) vyžadují roli Přispěvatel virtuálních počítačů nebo vlastní roli s těmito konkrétními oprávněními:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/akce dokončení restartu
    • Microsoft.Compute/virtualMachines/powerOff/action

    K přiřazení oprávnění jednotlivým identitám můžete použít azure Portal nebo rutiny Azure PowerShellu:

    Pokud chcete přiřadit oprávnění, postupujte podle kroků v tématu Přiřazení rolí Azure pomocí webu Azure Portal.


  1. Importujte Az.ResourceGraph modul. Ujistěte se, že je modul aktualizovaný na ThreadJob s modulem verze 2.0.3.

Vytvoření aplikace funkcí

  1. Podle pokynů vytvořte aplikaci funkcí.

  2. Chcete-li přejít k prostředku a načíst závislosti, použijte následující postup.

    Poznámka:

    Závislosti musíte načíst jenom poprvé. Pokud se nedaří načíst závislosti PowerShellu, zkontrolujte nejnovější verze Az a Az.ResourceGraph.

    1. V aplikaci funkcí vyberte Soubory aplikace.

    2. V části host.json nastavte ManagedDependency na Pravda a vyberte requirements.psd1.

    3. V části requirements.psd1 vložte následující kód:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Zvolte Uložit.

  3. Restartujte aplikaci funkcí z karty Přehled a načtěte závislosti uvedené v souboru requirements.psd1 .

Vytvoření funkce

  1. Po vytvoření aplikace funkcí přejděte k prostředku, přejděte na Přehled a pak vyberte Vytvořit na webu Azure Portal.

  2. V podokně Vytvořit funkci proveďte následující výběry:

    1. V části Vybrat vývojové prostředí v části Vývojové prostředí vyberte Vývoj na portálu.

    2. V části Vybrat šablonu vyberte event grid.

    3. V části Podrobnosti o šabloně vyberte název nové funkce. Pak vyberte Vytvořit.

      Snímek obrazovky znázorňující výběry pro vytvoření funkce

  3. V podokně Funkce Event Grid vyberte Kód+Test z nabídky vlevo. Vložte následující kód a pak vyberte Uložit.

    # 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. V nabídce vlevo vyberte Integrace. Pro spouštěč zadejte název parametru spouštěče události. Použijte stejný název parametru uvedený v okně Code+Test . V příkladu je parametr eventGridEvent.

    Snímek obrazovky znázorňující vložení názvu parametru pro spouštěč události

  5. Zvolte Uložit.

Vytvoření odběru událostí

  1. Přihlaste se k webu Azure Portal a přejděte na Správce aktualizace Azure.

  2. V části Spravovat vyberteKonfigurace údržby>.

  3. V podokně Konfigurace údržby vyberte konfiguraci.

  4. V části Nastavení vyberte Události.

  5. Výběrem možnosti +Odběr události vytvořte událost před údržbou nebo po údržbě.

  6. V podokně Vytvořit odběr událostí zadejte v části Podrobnosti odběru událostí odpovídající název. Ponechte schéma jako schéma Event Gridu.

  7. V části Typy událostí v části Filtrovat podle typů událostí vyberte Událost před údržbou nebo Po dokončení údržby.

  8. V části Podrobnosti o koncovém bodu vyberte koncový bod funkce Azure a pak vyberte Konfigurovat koncový bod.

  9. Zadejte příslušné podrobnosti, jako je skupina prostředků a funkční aplikace pro spuštění události.

  10. Vyberte Vytvořit.

K ukládání, odesílání a příjmu událostí můžete také použít účty Azure Storage a centrum událostí. Další informace najdete v rychlých startech k vytvoření fronty ve službě Azure Storage a vytvoření centra událostí pomocí webu Azure Portal.