博主最近項目中遇到 VMWare相關,涉及到VCenter的結構數據,發現網上可以查詢到的資料太少了,這里先整理下基礎知識:
首先VCenter是一直集成管理 VMWare的平台,可以創建包括 數據中心,集群,物理機,虛擬機,數據存儲 這些主要節點;還可以創建如 文件, 資源池等;
然后下來就是基於python的 pyVmomi庫 來連接 VMWare SDK,簡單查詢一些信息。
安裝庫的方法就不羅列了,但是這里有一個坑
在引用庫的時候有這么一句
1 from pyVmomi import vim
會有提示找不到 vim 請忽略此問題 ,實際是可以找到的
下面列下代碼:
1 # -*- coding: utf-8 -*- 2 # VMware操作類 3 # 作者: XX 4 # 時間: 2020-07-18 5 6 from pyVim.connect import SmartConnectNoSSL 7 from pyVmomi import ServerObjects 8 from pyVmomi import vim 9 from WorkBase import WorkBase 10 from WorkUtils.UtilsLog import UtilsLog 11 12 13 class UtilsVMware: 14 def __init__(self): 15 self.log = UtilsLog() 16 self.log.info("調用VMware操作類") 17 self.log.info(self.__class__) 18 19 self.ip = None 20 self.port = 443 21 self.username = None 22 self.password = None 23 24 self.client = None 25 self.content = None 26 self.result = None 27 self.message = None 28 29 def get_client(self): 30 """ 31 創建連接 32 """ 33 self.log.debug("創建連接") 34 try: 35 self.client = SmartConnectNoSSL(host=self.ip, 36 user=self.username, 37 pwd=self.password, 38 port=self.port 39 ) 40 self.content = self.client.RetrieveContent() 41 self.result = True 42 except Exception as e: 43 self.result = False 44 self.message = e 45 46 def _get_all_objs(self, obj_type, folder=None): 47 """ 48 根據對象類型獲取這一類型的所有對象 49 """ 50 if folder is None: 51 container = self.content.viewManager.CreateContainerView(self.content.rootFolder, obj_type, True) 52 else: 53 container = self.content.viewManager.CreateContainerView(folder, obj_type, True) 54 return container.view 55 56 def _get_obj(self, obj_type, name): 57 """ 58 根據對象類型和名稱來獲取具體對象 59 """ 60 obj = None 61 content = self.client.RetrieveContent() 62 container = content.viewManager.CreateContainerView(content.rootFolder, obj_type, True) 63 for c in container.view: 64 if c.name == name: 65 obj = c 66 break 67 return obj 68 69 def get_datacenters(self): 70 """ 71 返回所有的數據中心 72 """ 73 return self._get_all_objs([vim.Datacenter]) 74 75 def get_ClusterComputeResource_by_name(self, name): 76 """ 77 根據集群名稱查詢對象 78 """ 79 return self._get_obj([vim.ClusterComputeResource], name) 80 81 def get_HostSystem_by_name(self, name): 82 """ 83 根據物理機名稱查詢對象 84 """ 85 return self._get_obj([vim.HostSystem], name) 86 87 def get_VirtualMachine_by_name(self, name): 88 """ 89 根據虛擬機機名稱查詢對象 90 """ 91 return self._get_obj([vim.VirtualMachine], name) 92 93 def get_pm_summary(self, name): 94 """ 95 查詢物理機信息 96 """ 97 hostSystem_obj = self.get_HostSystem_by_name(name=name) 98 return hostSystem_obj.summary 99 100 def get_vm_summary(self, name): 101 """ 102 查詢虛擬機信息 103 """ 104 virtualMachine_obj = self.get_VirtualMachine_by_name(name=name) 105 return virtualMachine_obj.summary 106 107 def get_pm_obj(self, name): 108 """ 109 根據物理機名稱組裝對象 110 """ 111 self.log.debug("物理機名稱:" + name) 112 hostSystem_obj = self.get_HostSystem_by_name(name=name) 113 114 pm_obj = { 115 "name": name, 116 "type": "pm", 117 "uuid": hostSystem_obj.summary.hardware.uuid, 118 "child": [], 119 } 120 121 # 物理機下的虛擬機 122 vm_data = [] 123 for v in hostSystem_obj.vm: 124 # 虛擬化對象 125 vm_obj = { 126 "name": v.name, 127 "type": "vm", 128 "uuid": str(v.summary.config.instanceUuid), 129 } 130 vm_data.append(vm_obj) 131 pm_obj["child"] = vm_data 132 return pm_obj 133 134 def get_data(self): 135 """ 136 集群對象類型:[vim.ClusterComputeResource] 137 物理機對象類型:[vim.HostSystem] 138 虛擬機對象:[vim.VirtualMachine] 139 獲取 Vcenter 下 數據中心,集群結構與 物理機 虛擬機的層級關系 140 """ 141 datacenter_objs = self.get_datacenters() 142 data = [] 143 # 獲取數據中心 144 for i in datacenter_objs: 145 146 self.log.debug("數據中心名稱:" + i.name) 147 148 datacenter_obj = { 149 "name": i.name, 150 "type": "datacenter", 151 "child": [], 152 } 153 154 # 根據數據中心的對象類型 155 for j in i.hostFolder.childEntity: 156 157 self.log.debug("類型:" + str(type(j))) 158 159 # 集群 160 if type(j) == vim.ClusterComputeResource: 161 self.log.debug("集群名稱:" + j.name) 162 cluster_obj = { 163 "name": j.name, 164 "type": "cluster", 165 "child": [], 166 } 167 clusterComputeResource_obj = self.get_ClusterComputeResource_by_name(name=j.name) 168 169 # 集群下的物理機 170 pm_data = [] 171 for h in clusterComputeResource_obj.host: 172 pm_obj = self.get_pm_obj(name=h.name) 173 pm_data.append(pm_obj) 174 175 cluster_obj["child"] = pm_data 176 datacenter_obj["child"].append(cluster_obj) 177 178 # 物理機 179 elif type(j) == vim.ComputeResource: 180 pm_obj = self.get_pm_obj(name=j.name) 181 datacenter_obj["child"].append(pm_obj) 182 183 data.append(datacenter_obj) 184 185 self.log.debug("data:") 186 self.log.debug(data) 187 return data 188 189 190 if __name__ == '__main__': 191 vm = UtilsVMware() 192 vm.ip = "XXX" 193 vm.username = "XXX" 194 vm.password = "XX" 195 vm.get_client() 196 # 得到結構數據 197 # vm.get_data() 198 # 打印此節點的虛擬機信息 199 print(vm.get_vm_summary(name="2.207-test"))
這里的獲取結構的思路不知道是否正確
思路是 先獲取數據中心 ,因為Vcenter下肯定會有數據中心的 然后就是 數據中心下 根據類型 可能是集群 ;可能直接就是物理機,物理機下就只有虛擬機了。
寫一個單獨的方法 ,根據物理機名稱組裝數據結構
最后下面是最后的結構數據:
1 [ 2 { 3 "name": "XXX", 4 "type": "datacenter", 5 "child": [ 6 { 7 "name": "XXX", 8 "type": "pm", 9 "uuid": "05e13742-dbf5-3552-be4a-d8024801a05e", 10 "child": [ 11 { 12 "name": "XXX", 13 "type": "vm", 14 "uuid": "50371259-b131-1698-6bdd-44988eab0dee" 15 } 16 ] 17 } 18 ] 19 }, 20 { 21 "name": "XXX", 22 "type": "datacenter", 23 "child": [ 24 { 25 "name": "XXX", 26 "type": "pm", 27 "uuid": "4c4c4544-005a-5910-8031-b9c04f4e4432", 28 "child": [ 29 { 30 "name": "XXX", 31 "type": "vm", 32 "uuid": "5037cda0-a771-482b-8344-ba6bab595d8d" 33 }, 34 ...... 35 ...... 36 ...... 37 { 38 "name": "XXX", 39 "type": "vm", 40 "uuid": "503761d0-50fb-d24f-0e22-17b9a6d5aaf2" 41 } 42 ] 43 }, 44 { 45 "name": "XXX", 46 "type": "cluster", 47 "child": [ 48 { 49 "name": "XXX", 50 "type": "pm", 51 "uuid": "43b43742-cc0c-36bd-6a95-4cc7ba799733", 52 "child": [] 53 } 54 ] 55 } 56 ] 57 } 58 ]
如果需要得到信息接通過 summary 對象來查詢就行。