TAM サービス Horizon

[TAM Blog] Horizon PowerCLI コマンドレット活用方法 (Part3)

みなさんこんにちは、VMware TAM の安です。

前回に引き続き、運用にお役立て頂ける VMware Horizon PowerCLI 活用シリーズをご展開致します。
今回は本シリーズ第二弾として、「操作 (CRUD) 系」パートを中心に、具体的なユースケースを交えてご紹介をしたいと思います。
実行ラボ環境、事前準備については前回と同様になりますので、ご覧になられてない方はこちらも合わせてご覧下さい。

■操作(CRUD)系コマンドに関して
まずはじめに、Pool, Desktop, EventDB への各種操作コマンドについて簡単にご紹介致します。
各コマンドの詳細につきましては「Get-Help "Command"」、もしくはこちらの Git リンクよりご参照頂けます。

この中でも特に、VMware Horizon 運用でご利用頂けるケースの多い Pool 操作にフォーカスして、今回ご紹介していきたいと思います。
*Desktops、EventDB については説明割愛致しますが、概要説明 / 実行例についてはこちらに記載が御座います。併せてご参照下さい。

それではさっそくみていきましょう。

まずは以降コマンドで使用する変数を、事前に定義しておきます。

$hvServer = 'horizon-01.corp.local' #Specify Connection Server
$PoolName = 'IC-Pool2' #Specify InstantClone's PoolName
$PoolDisplayName = 'Win10-IC-Pool2' #Specify InstantClone's PoolDisplayName
$Description = 'Create Win10 InstantClone Pool' #Specify description
$UserAssignment = 'FLOATING' #Specify FLOATING or Dedicated
$ParentVM = 'base-w10-x64-01' #Specify ParentVM
$SnapshotVM = 'IC Desktop2021' #Specify SnapshotVM
$ResourcePool = '/RegionA01/host/RegionA01-IC01/Resources' #Specify ResourcePool with FullPath
$VmFolder = '/RegionA01/vm/Discovered virtual machine/IC-Pool2' #Specify vmFolder with FullPath
$HostOrCluster = '/RegionA01/host/RegionA01-IC01' #Specify destination host with FullPath
$MaximumCount = '4' #Specify Pool's Provisioned Maximum VDI Count
$SpareCount = '1' #Specify Pool's Spare VDI Count
$MinimumCount = '3' #Specify Pool's Provisioned Minimum VDI Count
$Datastores = '/RegionA01/host/RegionA01-IC01/ESX04a-Local' #Specify destination datastore with FullPath
$NamingMethod = 'PATTERN' #Specify NamingMethod
$NamingPattern = 'Win10-IC-{n}' #Specify NamingPattern
$NetBiosName = 'corp' #Specify NetBiosName
$DomainAdmin = 'administrator' #Specify DomainAdmin

本ラボ環境ではインスタントクローン Pool ” IC-Pool1 ” が事前展開済みであるため、今回は” IC-Pool2 “を新たなインスタントクローン Pool として作成していきます。


・新規 Pool 作成コマンド
Pool 名のほか、ユーザのアサイン方式、VDI 最大展開台数、マスタ (親) 仮想マシンとそこに紐づくスナップショット等、パラメータ指定が複数必要となります。
New-HVPool -InstantClone -PoolName $PoolName -PoolDisplayName $PoolDisplayName -Description $Description -UserAssignment $UserAssignment -ParentVM $ParentVM -SnapshotVM $SnapshotVM -ResourcePool $ResourcePool -VmFolder $VmFolder -HostOrCluster $HostOrCluster -MaximumCount $MaximumCount -SpareCount $SpareCount -MinimumCount $MinimumCount -Datastores $Datastores -NamingMethod $NamingMethod -NamingPattern $NamingPattern -NetBiosName $NetBiosName -DomainAdmin $DomainAdmin
各パラメータの詳細につきましては Get-Help “New-HVPool” 、もしくはこちらからもご確認頂けます。

上記コマンド実行後、GUI 上からも指定したパラメータ通りに Pool の作成 / VDI 展開が進んでいることが確認できます。

今回新たに作成したインスタントクローン Pool ” IC-Pool2 “では、VDI 最大展開数を4台に設定しましたが、実際の展開台数とも一致していることが、仮想マシンタブからも確認できます。"Status = Available" となれば正常展開完了です。

では次に、上記で作成した Pool を削除してみましょう。

・既存 Pool 削除コマンド
該当 Pool 名のほか、必要に応じてオプション指定を行ったうえ実行していきます。
Remove-HVPool -hvServer $hvServer -poolName $PoolName -deleteFromDisk
*各パラメータの詳細につきましては、Get-Help "Remove-HVPool" 、もしくはこちらからもご確認頂けます。

上記コマンド実行後、GUI 上から削除処理 (Deleting) が走っていることが確認できます。

削除処理完了後、GUI 上からも表示されなくなり、正常に削除されたことが確認できます。

 

さてここまでは、インラインベースで1つずつコマンド操作を行う方法について、ご展開をさせて頂きました。
が、特に定常的(繰り返し)を行う操作等については、スクリプト化を実装頂くことで、一括実行による対応工数削減等、より簡素化/効率化された運用へ寄与するところも多く見込めるかと存じます。
そこで今回は、以下ケースをその一例として、スクリプト化による実装サンプルをご紹介したいと思います。

■想定ケースについて
VDI の展開 / 再構成後、一部仮想マシンでハングアップが発生することが時折ある。
・本事象発生時には、GUI (vSphere Client) から都度手動でのコンソール (VMware Remote Console:以下、”VMRC”) 起動を行い、各仮想マシンごとに画面上から状態確認を行っているが、1つ1つコンソールを起動させることにかなり手間が掛かる。>> 仮想マシン数が多い場合は特に顕著
・特定の Agent Status にある仮想マシンのみを抽出したうえで、該当仮想マシンに対して VMRC を自動起動させ、状態確認等の後続対応を進めたい。

■スクリプト化(組み立て)イメージについて
一連の操作フローに対して自動化を検討する場合、どこまでをスクリプトの対象にするか、どこは手動で確認/操作するかについて、まずは以下のようなかたちで小分けに捉えていくとよいでしょう。考えやすく(着手がしやすく)なります。


■実行スクリプトについて
今回はこちらのVMware EUCブログ(US)上にあるサンプルをベースに、各仮想マシンの Agent Status 抽出をまず行い、抽出した結果をそのまま VMRC 起動対象として、起動コマンドへ引き渡すかたちで実行しております。
なお、VMRC を起動する方法として、例として以下のようなコマンドを利用頂くことで、VMRC の複数同時起動が可能となります。※ 変数名などは適宜変更してご利用下さい。
foreach ($VMName in $VMNames){
Get-VM $VMName | Open-VMConsoleWindow}

■実行イメージ
それではさっそく実行してみましょう。
実行イメージ①
展開済みの VDI(仮想マシン)を10台のうち、今回は5台の仮想マシンがハングした状態("AGENT_UNREACHABLE")を想定とします。
*実際ラボ環境側もあらかじめその状態に整えております。

実行イメージ②
まずはコンソール (VMRC) 上から状態確認が必要な VDI を絞り込んでいきましょう。抽出対象を AGENT_UNREACHABLE に指定し、スクリプトを実行します。
*比較用として”C:\output\outputs.csv” には正常時 ("AVAILABLE") の出力をいれてあります。

スクリプト実行後、CSV の吐き出し先を指定するよう求められます。>> ここでは”C:\output\outputs.csv”を指定

すると、所定のファイルへ Appned されるかたちで抽出結果が吐き出されるので、VMRC 起動へ入る前に一度、対象となる仮想マシンをファイル(outputs.csv-Append)から確認しておきます。
今回は#6~#10の VDIAGENT_UNREACHABLE の状態であるので、意図した Agent Status にある仮想マシンのみが正しく拾えていることが確認できます。
*大規模環境の場合等、抽出数が多すぎる際には、操作端末への負荷を加味して CSV の分割等も検討しましょう。

実行イメージ③
出力ファイル確認後、読み込み先フォルダが求められているため、ここで再度パスを指定します。

実行イメージ④
すると、該当仮想マシンの VMRC が自動でポコポコと上がってきますので、あとはそのまま各画面から状態確認を頂き、後続の対応へ進むことができます。

*今回は各仮想マシンに対して再起動のみ実行させていたため、Boot 完了後はそのままログイン画面が表示されております。

いかがでしたでしょうか。
今回ご紹介したケースはあくまで一例となりますが、CLI を組み合わせてスクリプト化頂くことで、これまで手動で行っていた一連の操作も、自動化させるかたちで対応頂けます。運用工数の削減 / 属人化対応の防止等、自動化により享受できる運用メリットも多々あるのではないでしょうか。

本日ご展開した Power CLI 活用含め、VMware TAM サービスでは運用自動化に向けたご支援も行っております。
気になる方はぜひ担当 TAM までご相談下さい!