用python(pyvmomi)管理vmwareESXi/vCenter

不做發表於2018-09-19

環境

開發環境:Ubuntu 18.04 + python3.7
以下環境經過測試都可以使用:centos 6/7 + python3.4/3.6/3.7windows 7/2016 +python3.4/3.6/3.7

安裝必要模組pyvmomi

pip install pyvmomi 

如果是linux系統有pip2和pip3 兩個版本,需要使用

pip3 install pyvmomi

程式碼

host=`ESXi 機器ip`
user=`root`
password=`密碼`
port=443#埠
context = None
if hasattr(ssl, `_create_unverified_context`):
    context = ssl._create_unverified_context()
si = SmartConnect(host=host,user=user,pwd=password,port=port,sslContext=context)
if not si:
    print("帳號密碼有問題")
atexit.register(Disconnect, si)


###################################################################################################
def WaitForTasks(tasks, si):#任務
    pc = si.content.propertyCollector
    taskList = [str(task) for task in tasks]
    objSpecs = [vmodl.query.PropertyCollector.ObjectSpec(obj=task) for task in tasks]
    propSpec = vmodl.query.PropertyCollector.PropertySpec(type=vim.Task,pathSet=[], all=True)
    filterSpec = vmodl.query.PropertyCollector.FilterSpec()
    filterSpec.objectSet = objSpecs
    filterSpec.propSet = [propSpec]
    filter = pc.CreateFilter(filterSpec, True)
    try:
        version, state = None, None
        while len(taskList):
            update = pc.WaitForUpdates(version)
            for filterSet in update.filterSet:
                for objSet in filterSet.objectSet:
                    task = objSet.obj
                    for change in objSet.changeSet:
                        if change.name == `info`:
                            state = change.val.state
                        elif change.name == `info.state`:
                            state = change.val
                        else:
                            continue
                        if not str(task) in taskList:
                            continue
                        if state == vim.TaskInfo.State.success:
                            taskList.remove(str(task))
                        elif state == vim.TaskInfo.State.error:
                            raise task.info.error
            version = update.version
    finally:
        if filter:
            filter.Destroy()
def getvmname():#列印所有虛擬機器名
    content = si.RetrieveContent()
    for child in content.rootFolder.childEntity:
        if hasattr(child, `vmFolder`):
            datacenter = child
            vmFolder = datacenter.vmFolder
            vmList = vmFolder.childEntity
            for vm in vmList:
                print(vm.summary.config.name)
                print(vm.name)
def getvmstatus(vm_name):#獲取虛擬機器狀態
    content = si.RetrieveContent()
    for child in content.rootFolder.childEntity:
        if hasattr(child, `vmFolder`):
            datacenter = child
            vmFolder = datacenter.vmFolder
            vmList = vmFolder.childEntity
            for vm in vmList:
                if vm.summary.config.name == vm_name :
                    print(vm.summary.runtime.powerState)

def poweronvm(vm_name):#開啟虛擬機器
    content = si.content
    objView = content.viewManager.CreateContainerView(content.rootFolder,[vim.VirtualMachine],True)
    vmList = objView.view
    objView.Destroy()
    tasks = [vm.PowerOn() for vm in vmList if vm.name in vm_name]
    print(tasks)
    WaitForTasks(tasks, si)
    print("虛擬機器啟動成功")

def get_vmsnapshotinfo(vm_name):#檢視快照資訊
    content = si.RetrieveContent()
    container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True)
    for c in container.view:
        if c.name == vm_name:
            snapshots = c.snapshot.rootSnapshotList
            return snapshots
def get_vmlist():#獲取虛擬機器列表
    content = si.RetrieveContent()
    for child in content.rootFolder.childEntity:
        if hasattr(child, `vmFolder`):
            datacenter = child
            vmFolder = datacenter.vmFolder
            vmList = vmFolder.childEntity
            return vmList
def re_snapshot(vm_name,snapshot_name):##恢復快照
    for vm in get_vmlist():
        pass
        #print(vm.name)
        if vm.name == vm_name:
            snapshots = vm.snapshot.rootSnapshotList
            for snapshot in snapshots: 
                print(snapshot.name)               
                if snapshot_name == snapshot.name:
                    snap_obj = snapshot.snapshot
                    print ("恢復快照", snapshot.name)
                    task = [snap_obj.RevertToSnapshot_Task()]
                    WaitForTasks(task, si)

#re_snapshot("虛擬機器名","快照名") #恢復快照 
#print(get_vmsnapshotinfo("虛擬機器名")) #獲取虛擬機器快照資訊
#print(get_vmsnapshotinfo("虛擬機器名"))#檢視虛擬機器快照
#poweronvm("虛擬機器名") #開啟虛擬機器

其它功能我閒了就增加
如果有其它著急需求或者使用方法可以回帖尋求幫助


相關文章