Найти в Дзене

Как посмотреть свободные VDI в VMware Horizon с помощью PowerCLI

При работе с виртуальными столами VDI на базе VMware Horizon часто возникает необходимость узнать сколько осталось свободных рабочих мест, но если вы делаете привязку пользователей к виртуальной машине (Dedicated Assignment) и у вас много пулов, то такая задача становиться мучением, приходиться заходить в каждый пул и сортируя машины вычислять те, что еще не зарезервированы за пользователями.

Я смог решить такую задачу с помощью специального скрипта для PowerCLI, с дополнительной функцией, не входящей в состав отдельного модуля VMware.Hv.Helper необходимого для работы с VMware Horizon.

Как установить PowerCLI (Набор специальных компонентов для управления продуктами VMware через PowerShell) можно найти в интернете, модуль VMware.Hv.Helper можно скачать по ссылке https://github.com/vmware/PowerCLI-Example-Scripts

После установки всех модулей, мы создаем файл с расширением .ps1 и вставляем в него следующий код (в первой строчке потребуется внести данные для подключения к серверу Horizon, рекомендуется завести отдельную учетную запись с правами "только для чтения"):

Connect-HVServer -Server адрес сервера horizon -User "name@domain" -Password "password"

Function Get-HVMachineDetail{

$queryService = New-Object VMware.Hv.QueryServiceService

$defn = New-Object VMware.Hv.QueryDefinition

$defn.queryEntityType = 'MachineDetailsView'

$defn.sortBy = 'data.name'

$defn.sortDescending = $true

$hvServices = $Global:DefaultHVServers.ExtensionData

$queryResults = $queryService.QueryService_Create($hvServices, $defn)

# Handle results

try {

$vmresults= @()

while ($queryResults.results -ne $null) {

foreach ($result in $queryResults.Results) {

[VMware.Hv.MachineDetailsView]$MachineDetailsView = $result

$vmresults += $MachineDetailsView

# Do work.

}

# Fetch next page

if ($queryResults.id -eq $null) {

break;

}

$queryResults = $queryService.QueryService_GetNext($hvServices, $queryResults.id)

}

} finally {

if ($queryResults.id -ne $null) {

$queryService.QueryService_Delete($hvServices, $queryResults.id)

}

}

#Groups Vm Information

$vms = @()

foreach ($vm in $vmresults)

{

$tempobject = New-Object -TypeName psobject

$tempobject |Add-Member -MemberType NoteProperty -Name VM -value $vm.data.name

$tempobject |Add-Member -MemberType NoteProperty -Name AssignedUser -value $vm.data.assignedusername

$tempobject |Add-Member -MemberType NoteProperty -Name Pool -value $vm.desktopdata.name

$tempobject |Add-Member -MemberType NoteProperty -Name Hostname -value $vm.managedmachinedetailsdata.hostname

$vms += $tempobject

}

return $vms

}

Get-HVMachineDetail | Set-Content -Path c:\temp\all.txt

Выполнение данного скрипта выдаст информацию по всем пулам и по всем виртуальным машинам VDI в файл по пути c:\temp\all.txt

Для того, чтобы получить результат по свободным не назначенным машинам мы можем воспользоваться ограничением для выводимого результата, в следующем примере я оставляю только пулы в названии которых есть цифры 10 и 20, а также попрошу его показать строки, где имя назначенного пользователя пустое и сохранить результат в файл по пути c:\temp\free.txt

Get-HVMachineDetail | Where-Object {$_.Pool -like '*10*' -or $_.Pool -like '*20*' -and $_.AssignedUser -like ''} | Set-Content -Path c:\temp\free.txt