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 を使う。

程度がちょうど良いかと思います。