Condividi tramite


Tutorial: Creare eventi pre e post usando Funzioni di Azure

Si applica a: ✔️ Macchine virtuali Windows ✔️ Macchine virtuali Linux ✔️ Ambiente locale ✔️ Macchine virtuali Azure ✔️ Server abilitati per Azure Arc.

Questa esercitazione illustra come creare pre-eventi e post-eventi per avviare e arrestare una macchina virtuale in un flusso di lavoro delle patch di pianificazione usando Funzioni di Azure.

In questa esercitazione apprenderai a:

  • Prerequisiti
  • Creare un'app per le funzioni
  • Creare una funzione
  • Creare una sottoscrizione di eventi

Prerequisiti

  1. Assicurarsi di usare il runbook di PowerShell 7.2.

  2. Assegnare l’autorizzazione alle identità gestite: è possibile assegnare autorizzazioni all’identità gestita appropriata. Il runbook può usare l'identità gestita assegnata dal sistema dell'account di Automazione o un'identità gestita assegnata dall'utente.

    È possibile usare il portale o i cmdlet di PowerShell per assegnare autorizzazioni a ogni identità:

    Seguire la procedura descritta in Assegnare i ruoli di Azure usando il portale di Azure per assegnare le autorizzazioni


  1. Importare il modulo Az.ResourceGraph, assicurarsi che il modulo sia aggiornato a ThreadJob con la versione 2.0.3 del modulo.

Creare un'app per le funzioni

  1. Seguire la procedura per Creare un’app per le funzioni.

  2. Dopo aver creato l’app per le funzioni, passare alla risorsa, assicurarsi di caricare le dipendenze seguendo questa procedura:

    Nota

    È necessario caricare le dipendenze solo per la prima volta. Se le dipendenze di PowerShell non vengono caricate. Controllare le versioni più recenti di AZ e AZ. ResourceGraph.

    1. Nell’app per le funzioni, selezionare File dell’app.

    2. In host.json, impostare ManagedDependecy su True e selezionare requirements.psd1.

    3. In requirements.psd1, incollare il codice seguente:

       @{
       'Az'='12.*' 
       'Az.ResourceGraph'='1.0.0' 
       'Az.Resources'='6.*' 
       'ThreadJob' = '2.*'
       }
      
    4. Seleziona Salva.

  3. Riavviare l’app per le funzioni dalla scheda Panoramica per caricare le dipendenze indicate nel file requirements.psd1.

Creare una funzione

  1. Dopo aver creato l’app per le funzioni, passare a Risorsa e in Panoramica, selezionare Crea nel portale di Azure.

  2. Nella finestra Crea funzione, effettuare le selezioni seguenti:

    1. Per la Proprietà dell’ambiente di sviluppo, selezionare Sviluppa nel portale
    2. In Selezionare un modello, selezionare Griglia di eventi.
    3. In Dettagli modello, immettere il nome in Nuova funzione e quindi selezionare Crea. Screenshot che mostra le opzioni da selezionare durante la creazione di una funzione.
  3. Nella funzione Griglia di eventi, selezionare Codice e test dal menu a sinistra, incollare il codice seguente e selezionare Salva.

    # Make sure that we are using eventGridEvent for parameter binding in 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. Selezionare Integrazione nel menu a sinistra e modificare il nome del parametro del trigger di eventi in Trigger. Usare lo stesso nome di parametro specificato nella finestra Codice e test. Nell’esempio, il parametro è eventGridEvent.

    Screenshot che mostra il parametro eventGridEvent.

  5. Seleziona Salva

Creare una sottoscrizione di eventi

  1. Accedere al portale di Azure e passare a Gestore aggiornamenti di Azure.
  2. In Gestisci, selezionare Computer, Configurazione di manutenzione.
  3. Nella pagina Configurazione di manutenzione, selezionare la configurazione.
  4. In Impostazioni, selezionare Eventi.
  5. Selezionare Crea sottoscrizione di eventi per creare un pre-evento o post-evento di manutenzione.
  6. Nella pagina Crea sottoscrizione di eventi, immettere i dettagli seguenti:
    1. Nella sezione Dettagli sottoscrizione eventi specificare un nome appropriato.
    2. Mantenere lo schema come schema di Griglia di eventi.
    3. Nella sezione Tipi di eventi, Filtrare in base ai tipi di eventi.
      1. Selezionare Pre-evento di manutenzione per un pre-evento.
        • Nella sezione Dettagli endpoint, selezionare l’endpoint Funzione di Azure e selezionare Configura ed endpoint.
        • Specificare i dettagli appropriati, ad esempio Gruppi di risorse, app per le funzioni per attivare l’evento.
      2. Selezionare Post-evento di manutenzione per un post-evento.
        • Nella sezione Dettagli endpoint, l’endpoint Funzione di Azure e selezionare Configura ed endpoint.
        • Specificare i dettagli appropriati, ad esempio Gruppo di risorse, App per le funzioni per attivare l’evento.
  7. Seleziona Crea.

È anche possibile usare gli account di Archiviazione di Azure e l’hub eventi per archiviare, inviare e ricevere eventi. Altre informazioni su Come creare un hub eventi e Code di archiviazione.

Passaggi successivi