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

 

posted on 2020-07-21 09:48  堕落的伊丝莉  阅读(1564)  评论(1编辑  收藏  举报