PowerCLI コマンドで ESXi の設定確認・変更をしたいときに、
esxcli コマンドならできるのに PowerCLI ではコマンドレットが見つからないことがあります。
その場合、Get-EsxCli コマンドレットから esxcli を実行することができます。
実行例
例として、hv55n1.vmad.local という ESXi に対して Get-EsxCli を実行してみます。
※あらかじめ Connect-VIServerで vCenter もしくは ESXi に接続しておきます。
PowerCLI> Get-VMHost hv55n1* | select Name
Name
----
hv55n1.vmad.local ★このESXi に esxcli 実行します。
PowerCLI> Get-VMHost hv55n1* | Get-EsxCli
=========================
EsxCli: hv55n1.vmad.local
Elements:
--------- ★実行できるコマンドの一覧が表示されます。
device
esxcli
fcoe
graphics
hardware
iscsi
network
sched
software
storage
system
vm
vsan
ためしに、
2通りの書き方で esxcli から ESXi の時間を確認してみます。
同時に実行したわけではないので表示される時間は異なりますが、
書き方が違っても同様の結果が得られます。
(例1)
PowerCLI> $e = Get-VMHost hv55n1* | Get-EsxCli
PowerCLI> $e.system.time.get()
2014-03-15T14:45:56Z
(例2)
PowerCLI> Get-VMHost hv55n1* | % {($_ | Get-EsxCli).system.time.get()}
2014-03-15T14:45:59Z
個人的な感覚としては、上記の 例1 の書き方の方が一般的な気がします。
一方、ワンライナーが好きだったり、
esxcli を複数の ESXi に実行したかったりという場合は、
例2 のような書き方の方がコマンドラインを組み立てやすいと思います。
ちなみに、例2 のコマンドライン中の「%」は、
PowerShell では ForEach-Object の別名を表します。
「%」 の代わりに、「ForEach-Object」や「foreach」で置き換えられます。
PS> Get-Alias %,foreach | ft -AutoSize
CommandType Name Definition
----------- ---- ----------
Alias % ForEach-Object
Alias foreach ForEach-Object
esxcli を複数の ESXi に実行したい場合は、
例2 を応用して、下記のような情報取得もできます。
PowerCLI> Get-VMHost hv55n* | select Name,{($_ | Get-EsxCli).system.time.get()} | ft -AutoSize
Name ($_ | Get-EsxCli).system.time.get()
---- -----------------------------------
hv55n1.vmad.local 2014-03-15T15:15:23Z
hv55n2.vmad.local 2014-03-15T15:15:26Z
hv55n3.vmad.local 2014-03-15T15:15:24Z
hv55n4.vmad.local 2014-03-15T15:15:25Z
同様のことを ESXi のコンソールで実行した場合は下記のようになります。
esxcli ではスペース区切りだったところが、Get-EsxCli だと ドット( . ) 区切りになります。
また、コマンドラインの最後の単語(メソッドに相当する)は、Get-EsxCli では「()」が付きます。
※今回であれば、esxcli の「get」が、Get-EsxCli だと「get()」 になります。
~ # vmware -vl
VMware ESXi 5.5.0 build-1331820
VMware ESXi 5.5.0 GA
~ # esxcli system time get
2014-03-15T15:15:32Z
Get-EsxCli での esxcli 使用方法の調査について
esxcli と同様に、コマンドラインを途中の単語まで入力して実行することで、
サブコマンドの有無や、必要な引数についての情報がわかります。
ただ、esxcli をコンソールで実行した時のヘルプよりは読みにくいかもしれません。
PowerCLI> $e.system.time
===================
EsxCliElement: time
Methods:
--------
string get()
boolean set(long day, long hour, long min, long month, long sec, long year)
PowerCLI> $e.system.time.set
TypeNameOfValue : VMware.VimAutomation.ViCore.Util10Ps.EsxCliExtensionMethod
OverloadDefinitions : {boolean set(long day, long hour, long min, long month, long sec, long year)}
MemberType : CodeMethod
Value : boolean set(long day, long hour, long min, long month, long sec, long year)
Name : set
IsInstance : True
ためしに、上記を参考にして ESXi の時刻設定を変更してみました。
ただしコマンドの反映時間に数秒かかることがあるので、
厳密な時間設定にはあまり向かないかもしれません。
※実作業で時間を合わせる場合は これとは別に NTP サーバを参照させるはず・・・
PowerCLI> $e = Get-VMHost hv55n1* | Get-EsxCli
PowerCLI> $e.system.time.get()
2014-03-15T14:56:45Z
PowerCLI> $e.system.time.set(14,10,15,3,0,2014)
true
PowerCLI> $e.system.time.get()
2014-03-14T10:15:04Z ★時刻が変更された。
現在の最新 PowerCLI は、PowerCLI 5.5 R2 です。
VMware vSphere PowerCLI 5.5 Release 2 Release Notes
https://www.vmware.com/support/developer/PowerCLI/PowerCLI55R2/powercli55r2-releasenotes.html
リリースノートからもわかるように、PowerCLI はバージョンアップするたびに
できることが増えているため、Get-EsxCli を使う機会は
今後、減っていくのではないかと思います。
ただ、「普段 PowerCLI スクリプトを実行しているWindows から
どうしても esxcli を実行したくなった」といった場合には、
Get-EsxCli を使用すれば vSphere CLI (esxcli.exe が含まれる)を
追加インストールしなくても済みそうです。
以上、PowerCLI から esxcli を実行する方法についてでした。