PowerCLI – オブジェクトの変換
vSphere Web Services SDK (SDK) と vSphere PowerCLI (PowerCLI) の関係
SDK は vSphere の基礎となる SOAP API で、VMware の製品のほとんどが利用しています。vSphere Web Client の UI で仮想環境の操作を行う時、VMware Horizon 環境で仮想デスクトップをリコンポーズする時、Site Recovery Manager でテスト フェイルオーバーする時、などなど。
PowerCLI は .Net 版の SDK の上に実装されているコマンド ライン インターフェースになります。そして Get-View メソッドや ExtensionData プロパティを使えば、PowerCLI の CLI から SDK のメソッドやプロパティを実行することが可能です。ところが、PowerCLI は SDK 上に実装されているとは言え、SDK のすべてのメソッド、プロパティの代替が用意されているわけではありません。そのため Get-View や ExtensionData を使ってスクリプトを実装することがままあります。
SDK オブジェクトと PowerCLI オブジェクト
しかしながら、vSphere PowerCLI の範囲を超えて vSphere Web Services SDK の API を使い始めると、オブジェクトが vSphere PowerCLI のオブジェクトなのか vSphere Web Services SDK のオブジェクトなのかを意識する必要があります。
例えば仮想マシンを表すオブジェクトは両者で大きく異なります。まず、仮想マシンの PowerCLI オブジェクトを見てみましょう。
PS C:\Users\Administrator> Get-PowerCLIVersion
PowerCLI Version
----------------
VMware vSphere PowerCLI 6.3 Release 1 build 3737840
---------------
Component Versions
---------------
VMware Cloud Infrastructure Suite PowerCLI Component 6.3 build 3709081
VMWare AutoDeploy PowerCLI Component 6.0 build 3736841
VMWare ImageBuilder PowerCLI Component 6.0 build 3736841
VMware vSphere PowerCLI Component 6.3 build 3709081
PS C:\Users\Administrator> Get-VM "vc-l-01sp" | Get-Member
TypeName: VMware.VimAutomation.ViCore.Impl.V1.VM.UniversalVirtualMachineImpl
Name MemberType Definition
---- ---------- ----------
ConvertToVersion Method T VersionedObjectInterop.ConvertToVersion[T]()
Equals Method bool Equals(System.Object obj)
......
次に、vSphere Web Services SDK のオブジェクトを見てみます。
PS C:\Users\Administrator> Get-VM "vc-l-01sp" | Get-View | Get-Member
TypeName: VMware.Vim.VirtualMachine
Name MemberType Definition
---- ---------- ----------
AcquireMksTicket Method VMware.Vim.VirtualMachineMksTicket AcquireMksTicket()
AcquireTicket Method VMware.Vim.VirtualMachineTicket AcquireTicket(string ticketType)
......
仮想マシンの PowerCLI オブジェクトの型は
- VMware.VimAutomation.ViCore.Impl.V1.VM.UniversalVirtualMachineImpl
SDK オブジェクトの型は
- VMware.Vim.VirtualMachine
となり、そのプロパティ、メソッドの種類も大きく異なります。
オブジェクトの変換
PowerCLI オブジェクト => SDK オブジェクト の変換には
- コマンドレット: Get-View
- プロパティ: ExtensionData
を使います。昔は Get-View しか手段がなかったのですが、PowerCLI 4.1 (build 264274) から ExtensionData が追加されました。
逆方向の変換、すなわち SDK オブジェクト => PowerCLI オブジェクトの変換には
- コマンドレット: Get-VIObjectByView
を使います。
以下に変換、逆変換の例を挙げます。
PS C:\Users\Administrator> Get-VM "vc-l-01sp" | Get-View | Get-VIObjectByVIView
Name PowerState Num CPUs MemoryGB
---- ---------- -------- --------
vc-l-01sp PoweredOn 2 8.000
PS C:\Users\Administrator>
使い勝手について
SDK は自由度が高いのですが、いかんせん古の設計のためメソッドのパラメーターを用意するのが億劫なこと この上ありません。そして都度都度 変換の必要に迫られるため、スクリプトが長大化しやすく、かつ、可読性が下がります。あくまで緊急的な時に利用し、使用する際も Function に閉じ込めるなど配慮をした方が、1ヶ月後の自分に優しいスクリプトとなります。
安易に SDK に逃げない!! きっと PowerCLI にメソッドがあるはず!! しかし、プロパティだけはどうにもならないのでその際は潔く ExtensionData を使う。
程度がちょうど良いかと思います。