Oktatóanyag: Karbantartás előtti és utáni események létrehozása az Azure Functions használatával

A következőkre vonatkozik: ✔️ Windows rendszerű virtuális gépek ✔️ Linux rendszerű virtuális gépek ✔️ Helyszíni környezet ✔️ Azure-beli virtuális gépek ✔️ Azure Arc-kompatibilis kiszolgálók.

Ez az oktatóanyag bemutatja, hogyan hozhat létre karbantartás előtti és utáni eseményeket egy virtuális gép (VM) ütemezett javítási munkafolyamatban való elindításához és leállításához az Azure Functions használatával.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Függvényalkalmazás létrehozása.
  • Hozzon létre egy függvényt.
  • Hozzon létre egy esemény-előfizetést.

Előfeltételek

  1. Ellenőrizze, hogy PowerShell 7.4 runbookot használ.

  2. Engedélyek hozzárendelése a megfelelő felügyelt identitáshoz. A runbook használhatja az Automation-fiók által a rendszernek hozzárendelt felügyelt identitást vagy a felhasználó által hozzárendelt felügyelt identitást.

    A következő példaszkriptekhez (virtuális gépek indításához és leállításához) virtuálisgép-közreműködői szerepkörre vagy egyéni szerepkörre van szükség az alábbi engedélyekkel:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/virtualMachines/restart/action
    • Microsoft.Compute/virtualMachines/powerOff/action

    Az Azure Portalon vagy az Azure PowerShell-parancsmagokkal engedélyeket rendelhet az egyes identitásokhoz:

    Az engedélyek hozzárendeléséhez kövesse az Azure-szerepkörök hozzárendelése az Azure Portal használatával című témakörben leírt lépéseket.


  1. Importálja a modult Az.ResourceGraph . Győződjön meg arról, hogy a modul a ThreadJob 2.0.3-s verziójával frissül.

Függvényalkalmazás létrehozása

  1. Függvényalkalmazás létrehozásához kövesse az alábbi lépéseket.

  2. Nyissa meg az erőforrást, és töltse be a függőségeket az alábbi lépésekkel.

    Feljegyzés

    A függőségeket csak az első alkalommal kell betölteni. Ha a PowerShell-függőségek betöltése sikertelen, ellenőrizze a Az és Az.ResourceGraph legújabb verzióját.

    1. Függvényalkalmazás esetén válassza az Alkalmazásfájlok lehetőséget.

    2. A host.jsonterületen állítsa a ManagedDependecy értéket True értékre, és válassza ki a requirements.psd1 elemet.

    3. A requirements.psd1 területen illessze be a következő kódot:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Válassza a Mentés lehetőséget.

  3. Indítsa újra a függvényalkalmazást az Áttekintés lapról a requirements.psd1 fájlban említett függőségek betöltéséhez.

Függvény létrehozása

  1. A függvényalkalmazás létrehozása után lépjen az erőforrásra, válassza az Áttekintés lehetőséget, majd válassza a Létrehozás lehetőséget az Azure Portalon.

  2. A Függvény létrehozása panelen végezze el a következő beállításokat:

    1. A Fejlesztési környezet kiválasztása területen válassza a Fejlesztés a portálon lehetőséget.

    2. A Sablon kiválasztása területen válassza az eseményrácsot.

    3. A Sablon részletei területen az Új függvény mezőben válassza ki a nevet. Ezután válassza a Létrehozás lehetőséget.

      A függvények létrehozására szolgáló kijelöléseket bemutató képernyőkép.

  3. Az Event grid függvénypanelen válassza a Kód+Tesztelés lehetőséget a bal oldali menüből. Illessze be a következő kódot, majd válassza a Mentés lehetőséget.

    # 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. A bal oldali menüben válassza az Integráció lehetőséget. Eseményindító esetén adja meg az Eseményindító paraméter névértékét. Használja ugyanazt a paraméternevet, amelyet a Code+Test ablakban megadott. A példában a paraméter a következő eventGridEvent: .

    Képernyőkép egy eseményindító paraméternevének bejegyzéséről.

  5. Válassza a Mentés lehetőséget.

Esemény-előfizetés létrehozása

  1. Jelentkezzen be az Azure portálra, és lépjen az Azure frissítéskezelőbe.

  2. A Kezelés területen válassza a Gépek>karbantartási konfigurációja lehetőséget.

  3. A Karbantartási konfiguráció panelen válassza ki a konfigurációt.

  4. A Beállítások területen válassza az Események lehetőséget.

  5. Az +Esemény-előfizetés lehetőséget választva előkarbantartást vagy karbantartás utáni eseményt hozhat létre.

  6. Az Esemény-előfizetés létrehozása panel Esemény-előfizetés részletei szakaszában adjon meg egy megfelelő nevet. Tartsa a sémát Event Grid-sémaként.

  7. Az Eseménytípusok szakaszban a Szűrés eseménytípusok között válassza a Karbantartás előtti esemény vagy a Karbantartás utáni esemény lehetőséget.

  8. A Végpont részletei szakaszban válassza ki az Azure-függvény végpontját, majd válassza a Végpont konfigurálása lehetőséget.

  9. Adja meg a megfelelő részleteket, például az erőforráscsoportot és a függvényalkalmazást az esemény aktiválásához.

  10. Válassza a Létrehozás lehetőséget.

Az Azure Storage-fiókokat és egy eseményközpontot is használhat események tárolására, küldésére és fogadására. További információkért tekintse meg az üzenetsor Azure Storage-beli létrehozásáról és egy eseményközpont azure portalon történő létrehozásáról szóló rövid útmutatókat.