2015年8月31日 星期一

使用 Python 整合 VMware vSphere

pyVmomi [1] 是一個由 VMware 官方釋出的 Python API,可以用來存取 vSphere/vCenter 的資源。
另外有一些簡易的使用範例 [2],可以大略參考要如何開始使用 Python 連接 vSphere/vCenter。
這篇是用來記錄初步介接 vSphere/vCenter 的經驗。


首先,要執行 pyVmomi 的主機必須安裝 pyVmomi 套件,可以簡單地透過 easy_install 或者 pip 來安裝。
easy_install pyvmomi

接著,程式要跟 vSphere/vCenter 連接,可以使用以下的程式碼:
import atexit
import requests
from pyVim import connect
from pyVmomi import vim
 
# Disable the checking of certification.
requests.packages.urllib3.disable_warnings()
# Initiate the connection to VMware vSphere.
service_instance = connect.SmartConnect(
        host="192.168.200.200",
        user="administrator@vsphere.local",
        pwd="qwer",
        port=443)
atexit.register(connect.Disconnect, service_instance)
 
# Get the session ID from the connection.
session_id = service_instance.content.sessionManager.currentSession.key
print("Session ID: %s" % session_id)
上述這段程式碼中,假設 vSphere/vCenter 的 IP 是 192.168.200.200
登入的使用者名稱是 administrator@vsphere.local、登入密碼是 qwer。
連線完成後,在連線資訊上可以取得 session ID,表示連線並且登入成功了。

再來的步驟,在 [2] 的不同範例中作法都不太一樣,我自己後來統一的作法都是取得 ContainerView,然後再做後續的解析。
content = service_instance.RetrieveContent()
object_view = content.viewManager.CreateContainerView(content.rootFolder, [], True)

for obj in object_view.view:
    print("Object %s" % obj)
上述程式碼中,CreateContainerView() 這個方法的第二個參數是篩選器,如果只想要特定某種類型的物件,可以在這裡輸入做篩選
沒有輸入的話,預設是會吐回所有的物件。
例如在我的環境中,執行結果如下:
Object 'vim.Datacenter:datacenter-2'
Object 'vim.Folder:group-v3'
Object 'vim.Folder:group-h4'
Object 'vim.Folder:group-s5'
Object 'vim.Folder:group-n6'
Object 'vim.Network:network-14'
Object 'vim.Network:network-13'
Object 'vim.Datastore:datastore-25'
Object 'vim.Datastore:datastore-12'
Object 'vim.Datastore:datastore-69'
Object 'vim.Datastore:datastore-53'
Object 'vim.Folder:group-h61'
Object 'vim.Folder:group-h60'
Object 'vim.ClusterComputeResource:domain-c7'
Object 'vim.ResourcePool:resgroup-8'
Object 'vim.HostSystem:host-11'
Object 'vim.Folder:group-v62'
Object 'vim.Folder:group-v67'
Object 'vim.VirtualMachine:vm-39'
Object 'vim.VirtualMachine:vm-36'
Object 'vim.VirtualMachine:vm-63'
Object 'vim.VirtualMachine:vm-40'
Object 'vim.VirtualMachine:vm-34'
Object 'vim.VirtualMachine:vm-33'
Object 'vim.VirtualMachine:vm-41'
Object 'vim.VirtualMachine:vm-32'
Object 'vim.VirtualMachine:vm-28'
Object 'vim.VirtualMachine:vm-26'
Object 'vim.VirtualMachine:vm-194'
Object 'vim.VirtualMachine:vm-149'
Object 'vim.VirtualMachine:vm-70'
Object 'vim.VirtualMachine:vm-54'
Object 'vim.VirtualMachine:vm-21'
Object 'vim.VirtualMachine:vm-19'
Object 'vim.VirtualMachine:vm-18'
Object 'vim.VirtualMachine:vm-68'
Object 'vim.VirtualMachine:vm-16'
Object 'vim.VirtualMachine:vm-65'
Object 'vim.VirtualMachine:vm-15'
Object 'vim.VirtualMachine:vm-58'
Object 'vim.VirtualMachine:vm-72'
印出來這些物件都是一個個的 Managed Object Type。
舉例來說,vim.VirtualMachine:vm-72 表示這是一個 VM,物件的種類是 vim.VirtualMachine
這時就可以去翻翻 VMware 的官方文件 [3],看看 vim.VirtualMachine 可以取得什麼東西。

假設我的目的是想要獲得 VM 的名字,從官方文件中可以一層層看出,路徑是 vim.VirtualMachine -> summary -> config -> name
所以完整的程式碼,可以用下述的程式碼,讓 pyVmomi 回傳所有 vSphere 上執行的 VM 的名字(的前三個字元)出來:
import atexit
import requests
from pyVim import connect
from pyVmomi import vim

# Disable the checking of certification.
requests.packages.urllib3.disable_warnings()
# Initiate the connection to VMware vSphere.
service_instance = connect.SmartConnect(
                    host="192.168.10.10",
                    user="administrator@vsphere.local",
                    pwd="qwer",
                    port=443)
atexit.register(connect.Disconnect, service_instance)

# Get the session ID from the connection.
session_id = service_instance.content.sessionManager.currentSession.key
print("Session ID: %s" % session_id)

content = service_instance.RetrieveContent()
object_view = content.viewManager.CreateContainerView(content.rootFolder, [], True)

for obj in object_view.view:
    if isinstance(obj, vim.VirtualMachine):
        print("Object %s" % obj.summary.config.name[0:3] + "...")

印出的結果如下:
Session ID: 52496234-f876-d189-75d1-c4ef41e899dd
Object [25...
Object [25...
Object sc-...
Object [25...
Object Fos...
Object Inc...
Object [25...
Object ovi...
Object A. ...
Object CAK...
Object VMw...
Object cf-...
Object sc-...
Object CAK...
Object vCe...
Object C. ...
Object B. ...
Object vm-...
Object [25...
Object sc-...
Object [25...
Object vSp...
Object sc-...


參考資料:
  1. vmware/pyvmomi
  2. vmware/pyvmomi-community-samples
  3. VMware vSphere API Reference Documentation

1 則留言:

Unknown 提到...

您好
能否請教您
我想透過pyvmomi來取得esxi hosts/vms performance data
但不知道如何使用performance manager
可以透過email向您請教嗎?