Недавно мы писали о выходе новой версии фреймворка для автоматизации операций в виртуальной инфраструктуре средствами сценариев VMware PowerCLI 13. Одной из его частей является модуль Horizon PowerCLI module, с помощью которого можно управлять различными аспектами VDI-инфраструктуры. Сегодня мы посмотрим, как это делается.
Модуль PowerCLI для Horizon служит прослойкой для управления конфигурациями виртуальной инфраструктуры десктопов посредством View API, который можно также использовать и путем прямого доступа. Помимо этого, в рамках инструментария по управлению VDI-cредой есть и набор дополнительных функций, доступных в репозитории на GitHub.
В дополнение к View API, инфраструктура Horizon также предоставляет и RESTful API, который называется VMware Horizon Server API. Он предназначен для взаимодействия с Connection Server (подробнее об этом можно прочитать тут).
Итого, мы имеем три основных набора инструментов:
Для начала работы с Horizon через PowerCLI вам нужно выполнить следующие действия:
Устанавливаем VMware PowerCLI
Загружаем и устанавливаем advanced functions
Обращаемся к документации
1. Установка VMware PowerCLI
Основные инструкции по установке находятся здесь. Для начала установки просто открываем Windows PowerShell Admin console и выбиваем команду:
Install-Module VMware.PowerCLI
Далее разрешаем локальное исполнение сценариев командой:
Set-ExecutionPolicy RemoteSigned
2. Установка Advanced Functions
Идем по этой ссылке в репозиторий на GitHub и загружаем пакет по кнопке Download ZIP:
Распаковываем zip-файл и копируем подпапку Hv.Helper в папке modules в одну из директорий модулей на вашем компьютере. Чтобы узнать нужный путь, нужно проверить переменную окружения $env:PSModulePath. Она может быть одной из следующих:
User specific: %UserProfile%\Documents\WindowsPowerShell\Modules
System wide: C:\Program Files\WindowsPowerShell\Modules
Разблокируем расширенные функции, чтобы их можно было исполнять. В командной строке PowerShell под администратором выполняем следующий набор команд:
dir ‘C:\Program
Files\WindowsPowerShell\Modules\VMware.HvHelper\’ |
Unblock-File
После этого будет создана глобальная переменная DefaultHVServers, которая содержит информацию о подключениях к серверам Horizon Connection Servers. Обратиться к ней можно через $Global:DefaultHVServers.
Самое интересное содержится в свойстве ExtensionData. Давайте назначим его переменной $Services и рассмотрим поближе:
Если вы посмотрите документацию к View API, то сможете понять назначение этих записей. Свойство ExtensionData содержит информацию о доступе к любым функциям View API.
Давайте рассмотрим несколько примеров. Сначала используем простую команду для получения всех серверов Horizon Connection Servers в рамках пода (pod). Команда View API ниже использует сервис ConnectionServer и метод ConnectionServer_List для назначения результатов переменной $hvServers1.
Теперь используем одну из расширенных функций для вывода списка всех виртуальных десктопов, в зависимости от состояния агента Horizon Agent в них. Это полезно, чтобы понять, в нормальном ли состоянии там находятся агенты, или они пришли в некорректное состояние ошибки.
Итак, выводим список десктопов, где юзер залогинен, но в текущей сессии он не присоединен:
Затем вы можете написать свой сценарий, который выводит десктопы, где Horizon Agent находится в одном из перечисленных некорректных состояний. Далее можно предпринять шаги по исправлению ситуации - например, перезагрузить машины, чтобы в некоторых из них ошибка исправилась (к примеру, для статуса AGENT_ERR_NEED_REBOOT).
Сценарий ниже позволяет как раз это и сделать. Вам нужно поменять параметры, специфические для вашей среды, такие как имя Connection Server, пользователь, пароль и другое. Если вы не хотите использовать пароль в открытом виде, то можете убрать его из команд Connect-HVServer и Connect-VIServer - тогда он будет запрошен в интерактивном режиме.
Также обратите внимание на параметр -WhatIf в команде Restart-VMGuest - он позволяет вам получить возможный результат исполнения команды без необходимости ее фактического исполнения.
####################################################################
# Get List of Desktops that have Horizon Agent in problem states.
# Reboot the OS of each of these.
####################################################################
#region variables
###################################################################
# Variables
###################################################################
$cs = 's1-hcs1.mydomain.com' #Horizon Connection Server
$csUser = 'administrator' #Connection Server user
$csPassword = 'mypassword' #Connection Server user password
$csDomain = 'mydomain' #Connection Server domain
$vc = 'vcenter1.mydomain.com' #vCenter Server
$vcUser = 'administrator@vsphere.local' #vCenter Server user
$vcPassword = 'mypassword' #vCenter Server password
$baseStates = @('PROVISIONING_ERROR',
'ERROR',
'AGENT_UNREACHABLE',
'AGENT_ERR_STARTUP_IN_PROGRESS',
'AGENT_ERR_DISABLED',
'AGENT_ERR_INVALID_IP',
'AGENT_ERR_NEED_REBOOT',
'AGENT_ERR_PROTOCOL_FAILURE',
'AGENT_ERR_DOMAIN_FAILURE',
'AGENT_CONFIG_ERROR',
'UNKNOWN')
#endregion variables
#region initialize
###################################################################
# Initialize
###################################################################
# --- Import the PowerCLI Modules required ---
Import-Module VMware.VimAutomation.HorizonView
Import-Module VMware.VimAutomation.Core
Set-PowerCLIConfiguration -InvalidCertificateAction Prompt
# --- Connect to Horizon Connection Server API Service ---
$hvServer = Connect-HVServer -Server $cs -User $csUser -Password $csPassword -Domain $csDomain
# --- Get Services for interacting with the View API Service ---
$services= $hvServer.ExtensionData
# --- Connect to the vCenter Server ---
Connect-VIServer -Server $vc -User $vcUser -Password $vcPassword
#endregion initialize
#region main
###################################################################
# Main
###################################################################
Write-Output ""
if ($services) {
foreach ($baseState in $baseStates) {
# --- Get a list of VMs in this state ---
Write-Host ("Get VMs with baseState: " + $baseState) -ForegroundColor Yellow
$ProblemVMs = Get-HVMachineSummary -State $baseState
foreach ($ProblemVM in $ProblemVMs) {
$VM = Get-VM -Name $ProblemVM.Base.Name
# --- Reboot each of the Problem VMs ---
Restart-VMGuest -VM $VM
# Add -WhatIf to see what would happen without actually carrying out the action.
}
}
Write-Output "", "Disconnect from Connection Server."
Disconnect-HVServer -Server $cs
} else {
Write-Output "", "Failed to login into Connection Server."
pause
}
# --- Disconnect from the vCenter Server ---
Write-Output "", "Disconnect from vCenter Server."
Disconnect-VIServer -Server $vc
#endregion main