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 對象來查詢就行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM