Поделиться через


Руководство. Создание событий предварительного обслуживания и после обслуживания с помощью Функций Azure

Применимо: ✔️ виртуальные машины ✔️ ✔️ Linux под управлением Windows На локальных ✔️ ✔️ серверах azure Arc.

В этом руководстве объясняется, как создать события предварительного обслуживания и после обслуживания для запуска и остановки виртуальной машины в запланированном рабочем процессе исправления с помощью функций Azure.

В этом руководстве вы узнаете, как:

  • Создайте приложение-функцию.
  • Создайте функцию.
  • Создайте подписку на события.

Prerequisites

  1. Убедитесь, что вы используете руководство PowerShell Runbook 7.4.

  2. Назначьте разрешения соответствующему управляемому удостоверению. Модуль Runbook может использовать назначаемое системой управляемое удостоверение учетной записи службы автоматизации или управляемое удостоверение, назначаемое пользователем.

    В следующих примерах скриптов (запуск и остановка виртуальных машин) требуется роль участника виртуальной машины или пользовательская роль с этими конкретными разрешениями:

    • Microsoft.Compute/virtualMachines/start/action
    • Microsoft.Compute/virtualMachines/deallocate/action
    • Microsoft.Compute/виртуальныеМашины/перезапуск/действие
    • Microsoft.Compute/virtualMachines/powerOff/action

    Вы можете использовать Azure портал или командлеты Azure PowerShell для назначения разрешений каждой учетной записи.

    Чтобы назначить разрешения, выполните действия, описанные в статье "Назначение ролей Azure" с помощью портала Azure.


  1. Импортируйте модуль Az.ResourceGraph. Убедитесь, что модуль обновлен до ThreadJob с помощью модуля версии 2.0.3.

Создание приложения-функции

  1. Выполните действия, чтобы создать приложение-функцию.

  2. Перейдите к ресурсу и загрузите зависимости, выполнив следующие действия.

    Note

    Необходимо загрузить зависимости только при первом запуске. Если зависимости PowerShell не загружаются, проверьте последние версии Az и Az.ResourceGraph.

    1. Для Function App выберите файлы приложения.

    2. В разделе host.json задайте ManagedDependency в значение True и выберите requirements.psd1.

    3. В разделе requirements.psd1 вставьте следующий код:

      @{
      'Az'='12.*' 
      'Az.ResourceGraph'='1.0.0' 
      'Az.Resources'='6.*' 
      'ThreadJob' = '2.*'
      }
      
    4. Нажмите кнопку "Сохранить".

  3. Перезапустите приложение-функцию на вкладке "Обзор ", чтобы загрузить зависимости, упомянутые в файле requirements.psd1 .

Создание функции

  1. После создания приложения-функции перейдите к ресурсу, перейдите к обзору и нажмите кнопку "Создать" на портале Azure.

  2. На панели "Создание функции " сделайте следующее:

    1. В разделе "Выбор среды разработки" для среды разработки выберите "Разработка на портале".

    2. В разделе "Выбор шаблона" выберите сетку событий.

    3. В разделе "Сведения о шаблоне" выберите имя новой функции. Затем выберите Создать.

      Снимок экрана: выбор для создания функции.

  3. В области функций сетки событий выберите "Код+тест " в меню слева. Вставьте следующий код и нажмите кнопку "Сохранить".

    # 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. В меню слева выберите "Интеграция". В поле "Триггер" введите значение имени параметра триггера события . Используйте то же имя параметра, указанное в окне Code+Test . В примере используется eventGridEventпараметр.

    Снимок экрана: запись имени параметра триггера события.

  5. Нажмите кнопку "Сохранить".

Создание подписки на события

  1. Войдите на портал Azure и перейдите в Диспетчер обновлений Azure.

  2. В разделе "Управление" выберитеконфигурацию обслуживания>.

  3. На панели "Конфигурация обслуживания" выберите конфигурацию.

  4. В разделе "Параметры" выберите "События".

  5. Выберите +Подписка на события событий , чтобы создать событие предварительного обслуживания или после обслуживания.

  6. На панели "Создание подписки на события" в разделе "Сведения о подписке на события " укажите соответствующее имя. Сохраните схему как схему сетки событий.

  7. В разделе "Типы событий " для фильтрации по типам событий выберите событие предварительного обслуживания или событие после обслуживания.

  8. В разделе "Сведения о конечной точке" выберите конечную точку функции Azure и выберите пункт "Настройка конечной точки".

  9. Укажите соответствующие сведения, например группу ресурсов и приложение-функцию для активации события.

  10. Нажмите кнопку "Создать".

Вы также можете использовать учетные записи хранения Azure и концентратор событий для хранения, отправки и получения событий. Дополнительные сведения см. в кратких руководствах по созданию очереди в службе хранилища Azure и созданию концентратора событий с помощью портала Azure.