Настройка средства масштабирования с помощью служба автоматизации Azure и Azure Logic Apps для Виртуального рабочего стола Azure

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

Примечание.

  • Собственное решение автомасштабирования Виртуального рабочего стола Azure общедоступно для пулов и пулов личных узлов и будет автоматически масштабировать виртуальные машины узла сеансов в соответствии с расписанием масштабирования. Для упрощения настройки рекомендуется использовать автомасштабирование. Дополнительные сведения см. в статье Планы автомасштабирования.

  • Вы не можете масштабировать узлы сеансов с помощью служба автоматизации Azure и Azure Logic Apps вместе с автомасштабированием в одном пуле узлов. Необходимо использовать один или другой.

Предварительные условия

Прежде чем приступить к настройке средства масштабирования, убедитесь, что у вас есть следующие компоненты:

  • Пул узлов Виртуального рабочего стола Azure.
  • Виртуальные машины пула узлов сеансов, настроенные и зарегистрированные в службе Виртуальных рабочих столов Azure.
  • Пользователь с ролью управления доступом на основе ролей участника (RBAC), назначенной в подписке Azure для создания ресурсов. Для создания управляемого удостоверения также потребуется роль администратора приложения и (или ) владельца RBAC.
  • Рабочая область Log Analytics (необязательно).

Компьютер, используемый для развертывания средства, должен иметь:

Если у вас есть все готово, давайте приступим.

Создание или обновление учетной записи служба автоматизации Azure

Примечание.

Если у вас уже есть учетная запись служба автоматизации Azure с runbook с более старой версией скрипта масштабирования, достаточно следовать приведенным ниже инструкциям, чтобы убедиться, что он обновлен.

Во-первых, вам потребуется учетная запись служба автоматизации Azure для запуска runbook PowerShell. Процедура, описанная в этом разделе, допустима, даже если у вас есть учетная запись служба автоматизации Azure, которую вы хотите использовать для настройки модуля Runbook PowerShell. Вот как его настроить:

  1. Откройте PowerShell.

  2. Выполните следующий командлет, чтобы войти в учетную запись Azure.

    Login-AzAccount
    

    Примечание.

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

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

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzAutoAccount.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzAutoAccount.ps1"
    
  4. Выполните следующий командлет, чтобы выполнить скрипт и создать учетную запись служба автоматизации Azure. Вы можете либо заполнить значения для параметров, либо закомментировать их, чтобы использовать значения по умолчанию.

    $Params = @{
         "AADTenantId"           = "<Azure_Active_Directory_tenant_ID>"   # Optional. If not specified, it will use the current Azure context
         "SubscriptionId"        = "<Azure_subscription_ID>"              # Optional. If not specified, it will use the current Azure context
         "UseARMAPI"             = $true
         "ResourceGroupName"     = "<Resource_group_name>"                # Optional. Default: "WVDAutoScaleResourceGroup"
         "AutomationAccountName" = "<Automation_account_name>"            # Optional. Default: "WVDAutoScaleAutomationAccount"
         "Location"              = "<Azure_region_for_deployment>"
         "WorkspaceName"         = "<Log_analytics_workspace_name>"       # Optional. If specified, Log Analytics will be used to configure the custom log table that the runbook PowerShell script can send logs to
    }
    
    .\CreateOrUpdateAzAutoAccount.ps1 @Params
    

    Примечание.

    Если политика не позволяет создавать ресурсы скриптов масштабирования в определенном регионе, обновите назначение политики и добавьте нужный регион в список разрешенных регионов.

  5. Если вы ранее не создавали учетную запись службы автоматизации, выходные данные командлета будут включать зашифрованный URI веб-перехватчика в переменную учетной записи службы автоматизации. Обязательно сохраните запись URI, так как вы будете использовать его в качестве параметра при настройке расписания выполнения для приложения логики Azure. При обновлении существующей учетной записи службы автоматизации можно получить URI веб-перехватчика с помощью PowerShell для доступа к переменным.

  6. Если вы указали параметр WorkspaceName для Log Analytics, выходные данные командлета также будут включать идентификатор рабочей области Log Analytics и его первичный ключ. Запишите идентификатор рабочей области и первичный ключ, так как их потребуется использовать позже с параметрами при настройке расписания выполнения для приложения логики Azure.

  7. Настроив учетную запись служба автоматизации Azure, войдите в подписку Azure и проверка, чтобы убедиться, что учетная запись служба автоматизации Azure и соответствующий модуль Runbook появились в указанной группе ресурсов, как показано на следующем рисунке:

    Изображение страницы обзора Azure, показывающее только что созданную учетную запись служба автоматизации Azure и модуль Runbook.

    Чтобы проверка, где должен находиться веб-перехватчик, выберите имя модуля Runbook. Затем перейдите в раздел Ресурсы модуля Runbook и выберите Веб-перехватчики.

Создание управляемого удостоверения

Теперь, когда у вас есть учетная запись служба автоматизации Azure, вам также потребуется настроить управляемое удостоверение, если вы еще этого не сделали. Управляемые удостоверения помогут runbook получить доступ к другим Microsoft Entra связанным ресурсам, а также пройти проверку подлинности важных процессов автоматизации.

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

Создание приложения логики Azure и расписание выполнения

Наконец, необходимо создать приложение логики Azure и настроить расписание выполнения для нового средства масштабирования. Сначала скачайте и импортируйте модуль PowerShell Для виртуализации рабочих столов , который будет использоваться в сеансе PowerShell, если вы еще этого не сделали.

  1. Откройте PowerShell.

  2. Выполните следующий командлет, чтобы войти в учетную запись Azure.

    Login-AzAccount
    
  3. Выполните следующий командлет, чтобы скачать скрипт для создания приложения логики Azure.

    New-Item -ItemType Directory -Path "C:\Temp" -Force
    Set-Location -Path "C:\Temp"
    $Uri = "https://raw.githubusercontent.com/Azure/RDS-Templates/master/wvd-templates/wvd-scaling-script/CreateOrUpdateAzLogicApp.ps1"
    # Download the script
    Invoke-WebRequest -Uri $Uri -OutFile ".\CreateOrUpdateAzLogicApp.ps1"
    
  4. Выполните следующий сценарий PowerShell, чтобы создать приложение логики Azure и расписание выполнения для пула узлов.

    Примечание.

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

    $AADTenantId = (Get-AzContext).Tenant.Id
    
    $AzSubscription = Get-AzSubscription | Out-GridView -OutputMode:Single -Title "Select your Azure Subscription"
    Select-AzSubscription -Subscription $AzSubscription.Id
    
    $ResourceGroup = Get-AzResourceGroup | Out-GridView -OutputMode:Single -Title "Select the resource group for the new Azure Logic App"
    
    $WVDHostPool = Get-AzResource -ResourceType "Microsoft.DesktopVirtualization/hostpools" | Out-GridView -OutputMode:Single -Title "Select the host pool you'd like to scale"
    
    $LogAnalyticsWorkspaceId = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Workspace ID returned by when you created the Azure Automation account, otherwise leave it blank"
    $LogAnalyticsPrimaryKey = Read-Host -Prompt "If you want to use Log Analytics, enter the Log Analytics Primary Key returned by when you created the Azure Automation account, otherwise leave it blank"
    $RecurrenceInterval = Read-Host -Prompt "Enter how often you'd like the job to run in minutes, e.g. '15'"
    $BeginPeakTime = Read-Host -Prompt "Enter the start time for peak hours in local time, e.g. 9:00"
    $EndPeakTime = Read-Host -Prompt "Enter the end time for peak hours in local time, e.g. 18:00"
    $TimeDifference = Read-Host -Prompt "Enter the time difference between local time and UTC in hours, e.g. +5:30"
    $SessionThresholdPerCPU = Read-Host -Prompt "Enter the maximum number of sessions per CPU that will be used as a threshold to determine when new session host VMs need to be started during peak hours"
    $MinimumNumberOfRDSH = Read-Host -Prompt "Enter the minimum number of session host VMs to keep running during off-peak hours"
    $MaintenanceTagName = Read-Host -Prompt "Enter the name of the Tag associated with VMs you don't want to be managed by this scaling tool"
    $LimitSecondsToForceLogOffUser = Read-Host -Prompt "Enter the number of seconds to wait before automatically signing out users. If set to 0, any session host VM that has user sessions, will be left untouched"
    $LogOffMessageTitle = Read-Host -Prompt "Enter the title of the message sent to the user before they are forced to sign out"
    $LogOffMessageBody = Read-Host -Prompt "Enter the body of the message sent to the user before they are forced to sign out"
    
    $WebhookURI = Read-Host -Prompt "Enter the webhook URI that has already been generated for this Azure Automation account. The URI is stored as encrypted in the above Automation Account variable. To retrieve the value, see https://learn.microsoft.com/azure/automation/shared-resources/variables?tabs=azure-powershell#powershell-cmdlets-to-access-variables"
    
    $Params = @{
         "AADTenantId"                   = $AADTenantId                             # Optional. If not specified, it will use the current Azure context
         "SubscriptionID"                = $AzSubscription.Id                       # Optional. If not specified, it will use the current Azure context
         "ResourceGroupName"             = $ResourceGroup.ResourceGroupName         # Optional. Default: "WVDAutoScaleResourceGroup"
         "Location"                      = $ResourceGroup.Location                  # Optional. Default: "West US2"
         "UseARMAPI"                     = $true
         "HostPoolName"                  = $WVDHostPool.Name
         "HostPoolResourceGroupName"     = $WVDHostPool.ResourceGroupName           # Optional. Default: same as ResourceGroupName param value
         "LogAnalyticsWorkspaceId"       = $LogAnalyticsWorkspaceId                 # Optional. If not specified, script will not log to the Log Analytics
         "LogAnalyticsPrimaryKey"        = $LogAnalyticsPrimaryKey                  # Optional. If not specified, script will not log to the Log Analytics
         "RecurrenceInterval"            = $RecurrenceInterval                      # Optional. Default: 15
         "BeginPeakTime"                 = $BeginPeakTime                           # Optional. Default: "09:00"
         "EndPeakTime"                   = $EndPeakTime                             # Optional. Default: "17:00"
         "TimeDifference"                = $TimeDifference                          # Optional. Default: "-7:00"
         "SessionThresholdPerCPU"        = $SessionThresholdPerCPU                  # Optional. Default: 1
         "MinimumNumberOfRDSH"           = $MinimumNumberOfRDSH                     # Optional. Default: 1
         "MaintenanceTagName"            = $MaintenanceTagName                      # Optional.
         "LimitSecondsToForceLogOffUser" = $LimitSecondsToForceLogOffUser           # Optional. Default: 1
         "LogOffMessageTitle"            = $LogOffMessageTitle                      # Optional. Default: "Machine is about to shutdown."
         "LogOffMessageBody"             = $LogOffMessageBody                       # Optional. Default: "Your session will be logged off. Please save and close everything."
         "WebhookURI"                    = $WebhookURI
    }
    
    .\CreateOrUpdateAzLogicApp.ps1 @Params
    

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

    Изображение страницы обзора для примера приложения логики Azure.

    Чтобы внести изменения в расписание выполнения, например изменить интервал повторения или часовой пояс, перейдите в планировщик автомасштабирования Приложения логики Azure и нажмите кнопку Изменить, чтобы перейти к Designer приложения логики Azure.

    Изображение Designer приложения логики Azure. Меню Повторение и веб-перехватчик, которые позволяют пользователю изменять время повторения и файл веб-перехватчика открыты.

Управление средством масштабирования

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

Просмотр состояния задания

Вы можете просмотреть сводное состояние всех заданий Runbook или более подробное состояние конкретного задания Runbook в портал Azure.

Справа от выбранной учетной записи служба автоматизации Azure в разделе "Статистика заданий" можно просмотреть список сводок всех заданий Runbook. При открытии страницы Задания в левой части окна отображаются текущие состояния заданий, время начала и время завершения.

Снимок экрана: страница состояния задания.

Просмотр журналов и выходных данных средства масштабирования

Журналы операций горизонтального и горизонтального масштабирования можно просмотреть, открыв модуль Runbook и выбрав задание.

Перейдите к runbook в группе ресурсов, в котором размещена учетная запись служба автоматизации Azure, и выберите Обзор. На странице обзора выберите задание в разделе Последние задания , чтобы просмотреть выходные данные средства масштабирования, как показано на следующем рисунке.

Изображение окна вывода для средства масштабирования.

Проверка номера версии скрипта Runbook

Вы можете проверка, какую версию скрипта Runbook вы используете, открыв файл Runbook в учетной записи служба автоматизации Azure и выбрав Вид. Скрипт для модуля Runbook появится в правой части экрана. В скрипте вы увидите номер версии в формате v#.#.# в SYNOPSIS разделе . Номер последней версии можно найти здесь. Если номер версии в скрипте runbook не отображается, это означает, что вы запускаете более раннюю версию скрипта и сразу же обновите ее. Если вам нужно обновить скрипт Runbook, следуйте инструкциям в разделе Создание или обновление учетной записи служба автоматизации Azure.

Как сообщать о проблемах

Когда вы сообщите о проблеме, вам потребуется указать следующие сведения, чтобы помочь нам устранить неполадки:

  • Полный журнал на вкладке Все журналы в задании, вызвавшего проблему. Чтобы узнать, как получить журнал, следуйте инструкциям в разделе Просмотр журналов и выходных данных средства масштабирования. Если в журнале есть какие-либо конфиденциальные или личные сведения, вы можете удалить их перед отправкой нам проблемы.

  • Версия используемого скрипта Runbook. Сведения о том, как получить номер версии, см. в статье Проверка номера версии скрипта Runbook.

  • Номер версии каждого из следующих модулей PowerShell, установленных в учетной записи служба автоматизации Azure. Чтобы найти эти модули, откройте учетную запись служба автоматизации Azure, выберите Модули в разделе Общие ресурсы в области слева от окна, а затем найдите имя модуля.

    • Az.Accounts
    • Az.Compute
    • Az.Resources
    • Az.Automation
    • OMSIngestionAPI
    • Az.DesktopVirtualization

Log Analytics

Если вы решили использовать Log Analytics, вы можете просмотреть все данные журнала в пользовательском журнале с именем WVDTenantScale_CL в разделе Настраиваемые журналы в представлении Журналы рабочей области Log Analytics. Мы перечислили некоторые примеры запросов, которые могут оказаться полезными.

  • Чтобы просмотреть все журналы для пула узлов, введите следующий запрос:

    WVDTenantScale_CL
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Чтобы просмотреть общее количество запущенных виртуальных машин узла сеансов и активных сеансов пользователей в пуле узлов, введите следующий запрос:

    WVDTenantScale_CL
    | where logmessage_s contains "Number of running session hosts:"
         or logmessage_s contains "Number of user sessions:"
         or logmessage_s contains "Number of user sessions per Core:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Чтобы просмотреть состояние всех виртуальных машин узла сеансов в пуле узлов, введите следующий запрос:

    WVDTenantScale_CL
    | where logmessage_s contains "Session host:"
    | where hostpoolName_s == "<host_pool_name>"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    
  • Чтобы просмотреть ошибки и предупреждения, введите следующий запрос:

    WVDTenantScale_CL
    | where logmessage_s contains "ERROR:" or logmessage_s contains "WARN:"
    | project TimeStampUTC = TimeGenerated, TimeStampLocal = TimeStamp_s, HostPool = hostpoolName_s, LineNumAndMessage = logmessage_s, AADTenantId = TenantId
    

Ограничения

Ниже приведены некоторые ограничения, связанные с масштабированием виртуальных машин узла сеансов с помощью этого сценария масштабирования:

  • Сценарий масштабирования не учитывает изменения времени между стандартным и переходом на летнее время.