最近 NSX API と対話していて、そこで指定するために vCenter Object ID を探しています。
NSX API では、vCenter インベントリのオブジェクト(VM や、ポートグループなど)を
ID で指定しなくてはいけないことがあります。
NSX vSphere API Guide
NSX 6.2 for vSphere
http://pubs.vmware.com/NSX-62/topic/com.vmware.ICbase/PDF/nsx_62_api.pdf
たとえば VM の名前ではなく、VMID を指定するのですが、
これは NSX API ではわからず、ID を探すのは結構大変なように感じています。
そこで、VMID の探し方をいくつか模索してみました。
1. Managed Object Browser から探す。
まずは、API ガイドにも説明がある Managed Object Browser(MOB)から VMID を探してみます。
MOB は、Web ブラウザで下記の URL にアクセスして vCenter 同様のユーザでログインすると見ることができます。
https: //<vCenterのアドレス>/mob
GUI から探す場合は、この方法が一番メジャーなのではないかと思います。
NSX API とは関係ないですが、KB でも MOB を使ってオブジェクトを見る方法が案内されていたりします。
vCenter Server での管理対象オブジェクト参照 (MoRef) の検索 (2095221) | VMware KB
MOB では、たとえば下記のように VMID を探すことができます。
今回は、vm01 と、vm02 という VM の ID を探してみます。
Web ブラウザから MOB にログインしました。「content」 リンクから、階層を降りていきます。
rootFolder に入ります。
データセンタ名(今回は dc01)のリンクがあります。
ここから、vCenter のインベントリ ツリーと同様の階層をたどっていきます。
リンクをたどっていくと、最初のスクリーンショットにあるように「test01」 フォルダ配下に
vm01、vm02 を見つけることができます。VMID は、それぞれ vm-1666 と vm-1667 でした。
2. PowerCLI から見る。
PowerCLI から、VMID を探してみます。
今のところ私としては、vCenter のオブジェクト ID を探す場合はこれが最も簡単な方法だと思っています。
取得した VMID をもとに、PowerShell の Invoke-WebRequest コマンドレットで
NSX API のリクエストを発行すると便利なのではないかと思います。
下記のような感じで、コマンドライン1行で簡単に ID を見つけることができます。
「ft -AutoSize」は表示結果の整形のためだけにつけています。
ただ、実際に欲しいのは、赤字の部分だけだったりします。
PowerCLI> Get-VM vm0? | sort Name | select Name,Id | ft -AutoSize
Name Id
---- --
vm01 VirtualMachine-vm-1666
vm02 VirtualMachine-vm-1667
少し長くなりますが、下記のように MoID の部分だけ取得することもできます。
PowerCLI> Get-VM vm0? | Get-View | sort Name | select Name,@{N="MOID";E={$_.MoRef.Value}} | ft -AutoSize
Name MOID
---- ----
vm01 vm-1666
vm02 vm-1667
3. Python で見てみる。
最近 Linux から NSX API を実行したいことがあり
PowerCLI 以外のスクリプト言語から VMID を取得しようとしています。
Perl の方がメジャー(vSphere CLI も Perl スクリプトなので・・・)な気もしますが、
Python で VMID を探してみました。
今回は、下記のように環境を準備してあります。
Python で vSphere を操作できるようにする。(pyvmomi)
対話的に Python を実行する場合、下記のような感じで VMID を取得できます。
Python を実行します。
[root@vm01 ~]# python
Python 2.7.5 (default, Nov 21 2015, 00:39:04)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
vCenter に接続して・・・
>>> from pyVim import connect
>>> from pyVmomi import vim
>>> si = connect.SmartConnect(host='vCenterのアドレス',user='vCenterのユーザ',pwd='パスワード')
>>>
VMID を取得してみました。
ルート(先ほどの MOB にもあった rootFolder)配下の、すべての VM の情報を取得しています。
>>> content = si.RetrieveContent()
>>> containerView = content.viewManager.CreateContainerView(content.rootFolder,[vim.VirtualMachine],True)
>>> for vm in containerView.view:
... print vm._moId, vm.name
...
vm-1667 vm02
vm-1666 vm01
>>>
下記のような感じで、VM の名前から ID を探すとこができます。
実際は VM 名がユニークとは限らないので、ちゃんと絞り込まないといけないです。
>>> for vm in containerView.view:
... if vm.name == 'vm01':
... print vm._moId
...
vm-1666
>>>
そして下記のような感じで簡易的なスクリプトファイルを用意して、VMID 取得しています。
connect_info.py
vc_addr = 'vCenterのアドレス'
vc_user = 'vCenterのユーザ'
vc_pwd = 'パスワード'
get_vmid.py
import atexit
import sys
from pyVim import connect
from pyVmomi import vim
execfile('connect_info.py')
vmname = sys.argv[1]
si = connect.SmartConnect(host=vc_addr, user=vc_user, pwd=vc_pwd)
atexit.register(connect.Disconnect, si)
content = si.RetrieveContent()
si.content.rootFolder
container = content.rootFolder
viewType = [vim.VirtualMachine]
recursive = True
containerView = content.viewManager.CreateContainerView(container, viewType, recursive)
for vm in containerView.view:
if vm.name == vmname:
print vm._moId
こんな感じでスクリプトを実行して、VM 名から ID を取得しています。
[root@vm01 ~]# python get_vmid.py vm01
vm-1666
[root@vm01 ~]# python get_vmid.py vm02
vm-1667
4. とりあえず、Web Client のコンソールから。
VM の ID だけであれば、よく見ると vSphere Web Client のコンソールの URL に VMID が含まれています。
引き続き、悩ましい vCenter Object ID の探し方を模索したいと思います。
以上、vCenter Object ID を探してみる話でした。