zoukankan      html  css  js  c++  java
  • 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 对象来查询就行。

  • 相关阅读:
    docker下用keepalived+Haproxy实现高可用负载均衡集群
    Centos 7 搭建蓝鲸V4.1.16社区版
    IDEA中Thrift插件配置
    idea打包java可执行jar包
    CentOS7 docker.repo 用阿里云Docker Yum源
    linux 配置maven环境变量
    Linux中修改docker镜像源及安装docker
    Spring-boot和Spring-Cloud遇到的问题
    IntelliJ Idea 常用快捷键列表
    Invocation of destroy method failed on bean with name ‘XXXX’
  • 原文地址:https://www.cnblogs.com/cllovewxq/p/13353290.html
Copyright © 2011-2022 走看看