2019年7月16日火曜日

Developer Center と Code Capture で楽々PowerCLI 生活

先日、コミュニティ勉強会 VMware DevOps Meetup #2 https://vmware.connpass.com/event/133712/ にて LT 枠でお話しした内容となりますが、こちらにも内容をアップします。

※ SlideShare にアップした当日の資料は以下となります。




当日は70名近くの方にお聴き頂いたのですが、意外と昔からあった「Onyx」という vSphere Client の操作を PowerCLI 等のコードに吐き出すツールについてはご存知なかったようで、聴講頂いた方がさっそく Twitter に試した事を投稿して頂いたりと反応がありました。

Onyx の変遷

これまで代々の Onyx は VMware Flings の Lab ツールとして公開されていました。

第 1 世代 Onyx : vSphere Client (C#) 

一番最初の Onyx は C# vSphere Client から vCenter への通信をプロキシの様に間に入ってキャプチャしてコードを吐き出すツールで、PowerCLI 以外にも出力が対応していました。
この頃からの vSphere ユーザーの方は知っている方が多い印象です。

第 2 世代 Onyx : Flash Web Client

第2世代の Onyx は Flash Web Client 向けに vApp テンプレートと vCenter Web Client プラグインの形で提供されていました。
プラグインの形で組み込むのでバージョンアップ時の互換や、入れ替えにちょっと面倒なところがあって、私の周りではほとんど利用者はいませんでした。

第 3 世代 Onyx : Onyx for HTML5 vSphere Client

vApp で提供される HTML5 vSphere Client の Lab版では Onyx は Code capture と名を変えて登場し、最新の vSphere 6.7 でも利用が可能になりました。


この様な変遷を経て進化した Onyx ( Code Capture ) の機能でしたが、
Labs Flings の無償ツールであって、正規サポートされたツールではありませんでした。
それゆえ、本番環境へのインストールが必要な 第2世代 Onyx あたりで利用ユーザーが大幅に減ってしまった...という状況でした。

また、環境毎に対応するバージョンも異なり、更新する際には 新規に OVF をデプロイしたり、 vCenter Plugin を入れなおす必要があり、これまたリソースを Onyx のためだけに準備するのも面倒になってしまった。
周りの声を聞く限り、第1世代 Onyx のようなシンプルさが求められていた様に思います。

vCenter 6.7u2 での 進化 : Developer Center 機能で API Explorer と Code Capture (Onyx)  が vSphere Client 内に標準実装

今まで無償ツールだった Code Capture が vCenter 6.7u2 に実装された Developer Center 機能に標準実装され遂に正式サポートされるようになりました。


※ API Explorer は vCenter 6.7u2 の vSphere Client 内の実装ではまだ使い勝手が良くなかったので、今回の紹介には含めない事としました。

Code Capture (旧Onyx) の操作イメージ

詳細は上のリンクの SlideShere の資料に載せていますが、Code Capture (旧Onyx)  の使い方は vCenter 6.7u2 から標準実装された Developer Center : デベロッパーセンター の画面を開き、
「コードキャプチャを有効にする」にチェックを入れて、「記録の開始」ボタンを押すか、一番上のメニューバーの  ボタンを押すだけで、その後の操作の記録が始まります。
※ エクセルやテキストエディタの操作マクロのキャプチャみたいなものと思ってください。



Capture が開始されたら、任意の操作を HTML5 vSphere Client で実施します。
※一部、PowerCLI への出力が未サポートの操作もあります。

ここでは試しに 'VSAN.ClomRepairDelay' の値をデフォルトの 60 (min) から 120 (min) に変更してみます。




設定変更が完了したら、「記録の停止」 かメニューバーの  ボタン(キャプチャ中はゆっくり点滅)を押して記録を終了します。
終了するとズラズラっとコードが出力されます。

出力されるコードは PowerCLI で操作する vSphere API のオブジェクトの形で吐き出されるので、PowerCLI コマンドレットの操作だけになれてしまっていると少し戸惑うかもしれません。Get-View がいたるところに存在します。

余計な行を省いて、設定変更箇所を以下に記します。
#---------------SupportedOption---------------
$_this = Get-View -Id 'OptionManager-EsxHostAdvSettings-19'
$_this.SupportedOption

 #---------------UpdateOptions---------------
$changedValue = New-Object VMware.Vim.OptionValue[] (1)
$changedValue[0] = New-Object VMware.Vim.OptionValue
$changedValue[0].Value = 120
$changedValue[0].Key = 'VSAN.ClomRepairDelay'
$_this = Get-View -Id 'OptionManager-EsxHostAdvSettings-19'
$_this.UpdateOptions($changedValue)


試しに コードを PowerCLI に貼り付けて動作を確認。
4台のホストの設定値の状態を確認してみます。
※ Get-AdvancedSetting -name 'VSAN.ClomRepairDelay' でも確認できますが、あえて $_this から情報を引いてみます
$_this.Setting |where {$_.key -eq 'VSAN.ClomRepairDelay'}

 Key Value
--- -----
VSAN.ClomRepairDelay 60
VSAN.ClomRepairDelay 60
VSAN.ClomRepairDelay 120
VSAN.ClomRepairDelay 60
他の3台のホストにも同じ設定を投入してみます。
#---------------SupportedOption---------------
$_this = Get-View -Id 'OptionManager-EsxHostAdvSettings-19'
$_this.SupportedOption

#---------------UpdateOptions---------------
$changedValue = New-Object VMware.Vim.OptionValue[] (1)
$changedValue[0] = New-Object VMware.Vim.OptionValue
$changedValue[0].Value = 120
$changedValue[0].Key = 'VSAN.ClomRepairDelay'
$_this = Get-View -Id 'OptionManager-EsxHostAdvSettings-19'
$_this.UpdateOptions($changedValue)

#-- 対象ホストをGet-VMHost で全ホストに変更 --#


$vmhost = Get-VMHost
$_this = Get-View -Id ($vmhost | get-view).ConfigManager.AdvancedOption
$_this | foreach-Object{$_.UpdateOptions($changedValue)}


全台が変更された事を確認します。
$_this.Setting |where {$_.key -eq 'VSAN.ClomRepairDelay'}
Key Value
--- -----
VSAN.ClomRepairDelay 120
VSAN.ClomRepairDelay 120
VSAN.ClomRepairDelay 120
VSAN.ClomRepairDelay 120

実は PowerCLI のコマンドレットにはこの辺りの機能はすでに実装されていて、今回の場合は「Set-AdvancedSetting」の使い方を知っていればサクッと設定もできてしまいます。
(Get-VMHost) | Get-AdvancedSetting -name 'VSAN.ClomRepairDelay' | select Entity,Name,Value
Entity Name Value
------ ---- -----
vxesx01.vx.local VSAN.ClomRepairDelay 60
vxesx04.vx.local VSAN.ClomRepairDelay 60
vxesx03.vx.local VSAN.ClomRepairDelay 60
vxesx02.vx.local VSAN.ClomRepairDelay 60

(Get-VMHost) | Get-AdvancedSetting -name 'VSAN.ClomRepairDelay' | Set-AdvancedSetting -Value 120 -Confirm:$false Name Value Type Description
---- ----- ---- -----------
VSAN.ClomRepairDelay 120 VMHost
VSAN.ClomRepairDelay 120 VMHost
VSAN.ClomRepairDelay 120 VMHost
VSAN.ClomRepairDelay 120 VMHost
ただ、Code Capture の出力は API の構造・仕組みを知るには便利ですし、バージョン毎に追加される(バージョンによっては含まれない)コマンドレットを使わなくても、API 直たたきの PowerCLI コードが出力されるので PowerCLI のバージョン間依存が少ない特徴があります。
※ 通常、API の構造を調べるには API Explorer を利用したり、Get-View で確認したり、または SDK のリファレンス <https://code.vmware.com/web/sdk/6.7/vsphere-management> をダウンロードして Readme を掘っていく必要がありました。