vCenter Object ID の探索。(VMID 編)

vCenter Object ID の探索。(VMID 編)

最近 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 を探してみます。

vmid-01.png

Web ブラウザから MOB にログインしました。「content」 リンクから、階層を降りていきます。

vmid-02.png

rootFolder に入ります。

vmid-03.png

データセンタ名(今回は dc01)のリンクがあります。

ここから、vCenter のインベントリ ツリーと同様の階層をたどっていきます。

vmid-04.png

リンクをたどっていくと、最初のスクリーンショットにあるように「test01」 フォルダ配下に

vm01、vm02 を見つけることができます。VMID は、それぞれ vm-1666 と vm-1667 でした。

vmid-5.png

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 が含まれています。

vmid-6.png

引き続き、悩ましい vCenter Object ID の探し方を模索したいと思います。

以上、vCenter Object ID を探してみる話でした。

Version history
Revision #:
1 of 1
Last update:
‎06-13-2016 07:57 AM
Updated by: