1. 程式人生 > 實用技巧 >pyVmomi連線VMWare SDK (簡單查詢)

pyVmomi連線VMWare SDK (簡單查詢)

  博主最近專案中遇到 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 = "172.16.2.29" 193 vm.username = "[email protected]" 194 vm.password = "Zmops@0610" 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 物件來查詢就行。