vm.gowatana.jp

NEOにほんごVMware(仮)

Horizon 8 デスクトップ プールの状況を PowerCLI で取得してみる。

Horizon 8 デスクトップ プールの空き状況を、おおまかに PowerCLI で取得してみます。View API を直接利用するよりも手軽な、PowerCLI の VMware Hv.Helper モジュールを利用しています。

 

今回の内容です。

 

今回の環境

Horizon のデスクトップ プールは、下記の要領で作成してあります。

 

test-win2019-pool-02 という名前のデスクトップ プールを作成してあり、デスクトップは 5つ展開されています。

 

デスクトップは、5つとも利用可能(AVAILABLE)になっています。

 

そして、PowerCLI の実行環境は下記のように準備してあります。

 

PowerCLI でのデスクトップ情報の取得

まず、PowerCLI の VMware.HvHelper に含まれる Connect-HvServer で、Horizon Connection Server に、下記のように接続しておきます。

Connect-HVServer "192.168.80.41" -Domain "EUC" -User "Administrator" -Password "VMware1!"

 

もっとも簡単に仮想デスクトップの情報を取得できるのは、Get-HVMachineSummary かなと思います。しかし、このコマンドレットの結果は整形しにくいので、今回は Get-HVMachine を利用します。

PS C:\work> Get-HVMachineSummary -PoolName "test-win2019-pool-02" | ft -AutoSize

Machine    DesktopPool          DNS Name                 User Host          Agent Datastore               Status
-------    -----------          --------                 ---- ----          ----- ---------               ------
test-ic-03 test-win2019-pool-02 test-ic-03.euc.go-lab.jp      192.168.80.31 8.5.0 Datastore-Local-VMFS-31 AVAILABLE
test-ic-01 test-win2019-pool-02 test-ic-01.euc.go-lab.jp      192.168.80.31 8.5.0 Datastore-Local-VMFS-31 AVAILABLE
test-ic-04 test-win2019-pool-02 test-ic-04.euc.go-lab.jp      192.168.80.31 8.5.0 Datastore-Local-VMFS-31 AVAILABLE
test-ic-05 test-win2019-pool-02 test-ic-05.euc.go-lab.jp      192.168.80.31 8.5.0 Datastore-Local-VMFS-31 AVAILABLE
test-ic-02 test-win2019-pool-02 test-ic-02.euc.go-lab.jp      192.168.80.31 8.5.0 Datastore-Local-VMFS-31 AVAILABLE

 

Get-HVMachine をただ実行すると、下記のような出力になってしまい、このままではデスクトップの情報がわかりません。

PS C:\work> Get-HVMachine -PoolName "test-win2019-pool-02"


Id                      : VMware.Hv.MachineId
Base                    : VMware.Hv.MachineBase
MessageSecurityData     : VMware.Hv.MachineMessageSecurityData
ManagedMachineData      : VMware.Hv.MachineManagedMachineData
MachineAgentPairingData : VMware.Hv.MachineAgentPairingData

Id                      : VMware.Hv.MachineId
Base                    : VMware.Hv.MachineBase
MessageSecurityData     : VMware.Hv.MachineMessageSecurityData
ManagedMachineData      : VMware.Hv.MachineManagedMachineData
MachineAgentPairingData : VMware.Hv.MachineAgentPairingData

Id                      : VMware.Hv.MachineId
Base                    : VMware.Hv.MachineBase
MessageSecurityData     : VMware.Hv.MachineMessageSecurityData
ManagedMachineData      : VMware.Hv.MachineManagedMachineData
MachineAgentPairingData : VMware.Hv.MachineAgentPairingData

Id                      : VMware.Hv.MachineId
Base                    : VMware.Hv.MachineBase
MessageSecurityData     : VMware.Hv.MachineMessageSecurityData
ManagedMachineData      : VMware.Hv.MachineManagedMachineData
MachineAgentPairingData : VMware.Hv.MachineAgentPairingData

Id                      : VMware.Hv.MachineId
Base                    : VMware.Hv.MachineBase
MessageSecurityData     : VMware.Hv.MachineMessageSecurityData
ManagedMachineData      : VMware.Hv.MachineManagedMachineData
MachineAgentPairingData : VMware.Hv.MachineAgentPairingData

 

そこで、API リファレンスを参考に必要な情報を探します。今回主に取得している情報は、下記のあたりです。

 

Get-HVMachine で取得できる結果から、さらに select(Select-Object)で、 MachineBase の情報を取得しています。

Get-HVMachine -PoolName "test-win2019-pool-02" | select `
@{N="DesktopPool";E={$_.Base.DesktopName}},
@{N="Desktop";E={$_.Base.Name}},
@{N="BasicState";E={$_.Base.BasicState}},
@{N="SessionCount";E={$_.Base.Session.count}}

 

実際には、下記のように情報取得できます。

PS C:\work> Get-HVMachine -PoolName "test-win2019-pool-02" | select `
>> @{N="DesktopPool";E={$_.Base.DesktopName}},
>> @{N="Desktop";E={$_.Base.Name}},
>> @{N="BasicState";E={$_.Base.BasicState}},
>> @{N="SessionCount";E={$_.Base.Session.count}}

DesktopPool          Desktop    BasicState SessionCount
-----------          -------    ---------- ------------
test-win2019-pool-02 test-ic-03 AVAILABLE             0
test-win2019-pool-02 test-ic-01 AVAILABLE             0
test-win2019-pool-02 test-ic-04 AVAILABLE             0
test-win2019-pool-02 test-ic-05 AVAILABLE             0
test-win2019-pool-02 test-ic-02 AVAILABLE             0

 

ユーザがデスクトップに接続すると、下記のように BasicState が CONNECTED になります。

PS C:\work> Get-HVMachine -PoolName "test-win2019-pool-02" | select `
>> @{N="DesktopPool";E={$_.Base.DesktopName}},
>> @{N="Desktop";E={$_.Base.Name}},
>> @{N="BasicState";E={$_.Base.BasicState}},
>> @{N="SessionCount";E={$_.Base.Session.count}}

DesktopPool          Desktop    BasicState SessionCount
-----------          -------    ---------- ------------
test-win2019-pool-02 test-ic-03 AVAILABLE             0
test-win2019-pool-02 test-ic-01 AVAILABLE             0
test-win2019-pool-02 test-ic-04 CONNECTED             1
test-win2019-pool-02 test-ic-05 AVAILABLE             0
test-win2019-pool-02 test-ic-02 AVAILABLE             0

 

デスクトップ ステータスの集計

PowerShell の Group-Object を利用することで、下記のように集計することもできます。

Get-HVMachine -PoolName "test-win2019-pool-02" | select `
@{N="DesktopPool";E={$_.Base.DesktopName}},
@{N="Desktop";E={$_.Base.Name}},
@{N="BasicState";E={$_.Base.BasicState}},
@{N="SessionCount";E={$_.Base.Session.count}} |
Group-Object BasicState | Sort-Object Name | select Name,Count

 

実際にコマンドラインを実行すると、下記のようにデスクトップの状態が集計できました。

PS C:\work> Get-HVMachine -PoolName "test-win2019-pool-02" | select `
>> @{N="DesktopPool";E={$_.Base.DesktopName}},
>> @{N="Desktop";E={$_.Base.Name}},
>> @{N="BasicState";E={$_.Base.BasicState}},
>> @{N="SessionCount";E={$_.Base.Session.count}} |
>> Group-Object BasicState | Sort-Object Name | select Name,Count

Name      Count
----      -----
AVAILABLE     4
CONNECTED     1

 

デスクトップ ステータスの簡易 HTML レポート生成例

PowerShell では、ConvertTo-Html を利用してテーブルを HTML に変換することもできます。

Get-HVMachine -PoolName "test-win2019-pool-02" | select `
@{N="DesktopPool";E={$_.Base.DesktopName}},
@{N="Desktop";E={$_.Base.Name}},
@{N="BasicState";E={$_.Base.BasicState}},
@{N="SessionCount";E={$_.Base.Session.count}} |
Group-Object BasicState | Sort-Object Name | select Name,Count | ConvertTo-Html

 

このスクリプトは、下記のようにデスクトップ プールを指定して実行します。

PS C:\work> .\get_desktop_pool_status_count.ps1 "test-win2019-pool-02"

 

実際に実行すると、下記のように HTML が出力されます。

 

これらのコマンドレットを組み合わせると、簡易的なプール状況確認ページを作成できたりします。今回は下記のようなスクリプトを作成してみました。

get_desktop_pool_status_count.ps1

gist.github.com

 

スクリプトを実行すると、下記のような感じです。


生成した HTML ファイルを Web ブラウザで表示してみました。

 

ちなみに、再プロビジョニングなどで AVAILABLE 以外の状態のデスクトップがあると、下記のように行が増えます。

 

これで簡易的なデスクトップ プールの状況確認ができるはず・・・

以上、PowerCLI で Horizon デスクトップ プールの様子を見てみる話でした。