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 = "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 对象来查询就行。