前置
vSphere 環境をさわるとき、ふつうは vSphere Client でがちゃがちゃ操作する。そのうち慣れてくるとだんだん PowerCLI 環境に手を出すようになって、CLI 環境でいっぱいの VM をまとめて操作できてやばいこれちょう便利うひょーってなる。なるんだけど、それにも慣れると、もともと提供されてるコマンドレットって地味にかゆいところに手が届かないことにぼんやりと気付き始める。で、細かい操作をしようとすると、結局は定義済みのコマンドレットを卒業して、.NET インタフェイスをさわったり View オブジェクトをこねくりまわしたりしないといけないということを悟る。
ここまで来ると Web でぐぐって出てくる情報もだんだん減ってきて、vSphere Client ではすぐできるのに PowerCLI ではどう書けばいいのやらさっぱりだなあ、というところがぽろぽろ生まれてくる。
ある操作をするためのインタフェイスに GUI と CUI がある場合、(VMware に限らず)だいたいは CUI の方が原始的で、原始的だからこそ細かいところまで “なんでもできるはず” という幻想を抱かせてくれる。だから “GUI でできるのに CUI でできない” という状況に遭遇すると、GUI だって結局中で API 叩いてるんだろ、コード教えろやこのやろう、的な気持ちになること請け合い。どうにも納得できない。
このエントリで紹介する VMware Onyx は、まさにその『GUI ではできるのに CUI でどうやるのかわからない』を解決してくれるすばらしいツールなのでした。
概要
ざっくりいうと、
- ローカルプロキシとして動作して
- vSphere Client と vCenter Server(または ESXi)の間の通信をフックして
- vSphere Client での操作を PowerCLI や C# のコードとして吐き出してくれる
というもの。この時点でもう便利そうな匂いがぷんぷんしてやばい。
しかも Onyx たんは存外にお行儀がよくて、吐かれたコードそのままこぴぺでも充分実用的。この手のトレス用ツールってだいたい可読性の著しく低い下品なコードを垂れ流すイメージがあったんだけど、これはそんなことなかった。
インストール
ダウンロードして解凍するだけ。
ダウンロードは以下のどちらかから。本エントリ作成時点での最新バージョンは 2.1.4 で、バイナリは “Onyx_2.1.4226.28167.zip”。
- http://labs.vmware.com/flings/onyx
- http://communities.vmware.com/community/vmtn/server/vsphere/automationtools/onyx
Windows XP 以前の環境(というか非 Unicode 環境?)だと、実行ファイルまでのパスに 2 バイト文字があると起動できなくなるっぽいので注意。
使い方
- 起動すると出てくる Onyx のメイン画面で、左上の
[Connect] ボタンを押下

- 接続先の vCenter Server(または ESXi)を入力。[Launch a client after connected] にチェックを入れて、vCenter Server(または ESXi)につなげるときの認証情報を入力

- vSphere Client が起動したら、Onyx の画面で左上の
[Start] ボタンを押下

- vSphere Client でコード化したい操作を実行
- Onyx の画面にコードが出力されることを確認

- 必要に応じてコードを整形
例
例えば CPU 数の変更。GUI では『仮想ソケット数』と『ソケットあたりのコア数』を別々に指定できるけど、PowerCLI では以下の通り、“コア数の合計” しか変更できない(正確にはここで変わるのは『仮想ソケット数』で、『ソケットあたりのコア数』が 1 で固定される)。
Set-VM <vmname> -NumCpu 4
# 仮想ソケット数 4、ソケットあたりのコア数 1 に変更される
ここで Onyx を使って、試しに仮想ソケット数を 2、ソケットあたりのコア数も 2 にしてコードを吐かせてみる。実際の出力が以下。

# ------- ReconfigVM_Task -------
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.changeVersion = "2012-11-xxTxx:xx:xx.xxxxxxx"
$spec.numCPUs = 4
$spec.numCoresPerSocket = 2
$_this = Get-View -Id 'VirtualMachine-vm-416'
$_this.ReconfigVM_Task($spec)
そんなわけで、仮想ソケット数とソケットあたりのコア数をばらばらに指定するには、VirtualMachineConfigSpec 型のオブジェクトを作って、numCPU に合計コア数、numCoresPerSocket にソケットあたりのコア数を入れてあげて、View オブジェクトの ReconfigVM_Task メソッドにそれを渡せばいいらしいことが分かる。
仮想ソケット数そのものを表すメンバ変数は無さそうで、これは numCPU を numCoresPerSocket で割った値が使われていそうだということも想像がつく。例えば 1 ソケット 4 コアにしたい場合は、numCPU にも numCoresPerSocket にも 4 を入れてあげればよさそうだと判断できる。よくわからなくてもてきとうに数字を変えて実際にやってみればよいわけで。
で、このままでも使えなくはないけど、要らないところやまわりくどいところを少し直してあげる。
4 行目、これは変更時刻情報なので丸ごと不要。8 行目、人間がコードを書く場合は ID 指定ではなくて名前指定のほうが楽なので書き方を変えてあげる。最終的には、例えばこんな感じ。
# ------- ReconfigVM_Task -------
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.numCPUs = 4
$spec.numCoresPerSocket = 2
$_this = Get-VM <vmname> | Get-View
$_this.ReconfigVM_Task($spec)
Get-View はもっといろいろやり方がある(Get-VM しないで Get-View に -Filter で @{“Name” = “”} 渡すとか、別の変数に VM 型のオブジェクトがあるなら Get-View にそれのメンバ変数 Id を渡すとか)し、もっと行数を減らせなくはないけど、このくらいがいちばん分かりやすい気がしている。
注意
- Onyx 経由の vSphere Client ではコンソールは開けない。ポートが 902 と 903 の通信はだめっぽい
- 削除系の操作はトレースできない? VM 消したりとか。細かく挙動追っていないので詳細不明
懸念
ここまで書いておいてアレなんだけど、vSphere 5.1 からは vSphere Client ではなくて vSphere Web Client が標準になってくるので、Onyx たんがアップデートしてくれないといずれ使えなくなる疑惑がある。5.1 ではまだ vSphere Client は提供されているけど、今後どうなるか不明だし、そもそも現行の Onyx たんが 5.1 で動くのかまだ試していないのでした。内部的な通信のアーキテクチャが変わっていたとしたらアウト。
まとめ
Web Client が標準になったからいつまで使えるかわからないけれども、GUI でできるのに PowerCLI でどう書けばよいかわからない操作はとりあえず Onyx にコード吐かせて眺めてみるとよいと思います。