zoukankan      html  css  js  c++  java
  • python结合pyvmomi 监控esxi的磁盘等信息

    1.安装python3.6.6
    
    # 安装依赖,一定要安装,否则后面可能无法安装一些python插件
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
    mkdir /usr/local/python36
    tar -zxf Python-3.6.6.tgz
    cd Python-3.6.6
    ./configure --prefix=/usr/local/python36
    make && make install
    ln -s /usr/local/python36/bin/python3 /usr/bin/python3
    ln -s /usr/local/python36/bin/pip3 /usr/bin/pip3
    
    # pip3 install --upgrade pip
    # yum install -y git
    
    # 安装监控vmware的sdk pyvmomi
    [root@wondershareID_web03:/usr/local/python36]# git clone https://github.com/vmware/pyvmomi.git
    [root@wondershareID_web03:/usr/local/python36]# cd pyvmomi/
    [root@wondershareID_web03:/usr/local/python36/pyvmomi]# ls
    docs  LICENSE.txt  MANIFEST.in  NOTICE.txt  pyVim  pyVmomi  README.rst  requirements.txt  sample  setup.cfg  setup.py  test-requirements.txt  tests  tox.ini
    [root@wondershareID_web03:/usr/local/python36/pyvmomi]# python3 setup.py install
    
    3.编写通过pyvmomi插件获取虚拟机信息的脚本
    
    #!/opt/python3/bin/python3
    #coding:utf-8
    
    """
    获取所有的vcenter相关信息
    包括exsi的硬件资源信息和vmware客户端的硬件分配信息
    """
    from pyVmomi import vim
    from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
    import atexit
    import argparse
    
    
    def get_args():
        parser = argparse.ArgumentParser(
            description='Arguments for talking to vCenter')
    
        parser.add_argument('-s', '--host',
                            required=True,
                            action='store',
                            help='vSpehre service to connect to')
    
        parser.add_argument('-o', '--port',
                            type=int,
                            default=443,
                            action='store',
                            help='Port to connect on')
    
        parser.add_argument('-u', '--user',
                            required=True,
                            action='store',
                            help='User name to use')
    
        parser.add_argument('-p', '--password',
                            required=True,
                            action='store',
                            help='Password to use')
    
        args = parser.parse_args()
        return args
    
    
    def get_obj(content, vimtype, name=None):
        '''
        列表返回,name 可以指定匹配的对象
        '''
        container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
        obj = [ view for view in container.view]
        return obj
    
    
    def main():
        esxi_host = {}
        args = get_args()
        # connect this thing
        si = SmartConnectNoSSL(
                host=args.host,
                user=args.user,
                pwd=args.password,
                port=args.port)
        # disconnect this thing
        atexit.register(Disconnect, si)
        content = si.RetrieveContent()
        esxi_obj = get_obj(content, [vim.HostSystem])
        for esxi in esxi_obj:
            esxi_host[esxi.name] = {'esxi_info':{},'datastore':{}, 'network': {}, 'vm': {}}
    
            esxi_host[esxi.name]['esxi_info']['厂商'] = esxi.summary.hardware.vendor
            esxi_host[esxi.name]['esxi_info']['型号'] = esxi.summary.hardware.model
            for i in esxi.summary.hardware.otherIdentifyingInfo:
                if isinstance(i, vim.host.SystemIdentificationInfo):
                    esxi_host[esxi.name]['esxi_info']['SN'] = i.identifierValue
            esxi_host[esxi.name]['esxi_info']['处理器'] = '数量:%s 核数:%s 线程数:%s 频率:%s(%s) ' % (esxi.summary.hardware.numCpuPkgs,
                                                                                          esxi.summary.hardware.numCpuCores,
                                                                                          esxi.summary.hardware.numCpuThreads,
                                                                                          esxi.summary.hardware.cpuMhz,
                                                                                          esxi.summary.hardware.cpuModel)
            esxi_host[esxi.name]['esxi_info']['处理器使用率'] = '%.1f%%' % (esxi.summary.quickStats.overallCpuUsage /
                                                           (esxi.summary.hardware.numCpuPkgs * esxi.summary.hardware.numCpuCores * esxi.summary.hardware.cpuMhz) * 100)
            esxi_host[esxi.name]['esxi_info']['内存(MB)'] = esxi.summary.hardware.memorySize/1024/1024
            esxi_host[esxi.name]['esxi_info']['可用内存(MB)'] = '%.1f MB' % ((esxi.summary.hardware.memorySize/1024/1024) - esxi.summary.quickStats.overallMemoryUsage)
            esxi_host[esxi.name]['esxi_info']['内存使用率'] = '%.1f%%' % ((esxi.summary.quickStats.overallMemoryUsage / (esxi.summary.hardware.memorySize/1024/1024)) * 100)
            esxi_host[esxi.name]['esxi_info']['系统'] = esxi.summary.config.product.fullName
    
            for ds in esxi.datastore:
                esxi_host[esxi.name]['datastore'][ds.name] = {}
                esxi_host[esxi.name]['datastore'][ds.name]['总容量(G)'] = int((ds.summary.capacity)/1024/1024/1024)
                esxi_host[esxi.name]['datastore'][ds.name]['空闲容量(G)'] = int((ds.summary.freeSpace)/1024/1024/1024)
                esxi_host[esxi.name]['datastore'][ds.name]['类型'] = (ds.summary.type)
            for nt in esxi.network:
                esxi_host[esxi.name]['network'][nt.name] = {}
                esxi_host[esxi.name]['network'][nt.name]['标签ID'] = nt.name
            for vm in esxi.vm:
                esxi_host[esxi.name]['vm'][vm.name] = {}
                esxi_host[esxi.name]['vm'][vm.name]['电源状态'] = vm.runtime.powerState
                esxi_host[esxi.name]['vm'][vm.name]['CPU(内核总数)'] = vm.config.hardware.numCPU
                esxi_host[esxi.name]['vm'][vm.name]['内存(总数MB)'] = vm.config.hardware.memoryMB
                esxi_host[esxi.name]['vm'][vm.name]['系统信息'] = vm.config.guestFullName
                if vm.guest.ipAddress:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = vm.guest.ipAddress
                else:
                    esxi_host[esxi.name]['vm'][vm.name]['IP'] = '服务器需要开机后才可以获取'
    
                for d in vm.config.hardware.device:
                    if isinstance(d, vim.vm.device.VirtualDisk):
                        esxi_host[esxi.name]['vm'][vm.name][d.deviceInfo.label] = str((d.capacityInKB)/1024/1024) + ' GB'
    
        f = open(args.host + '.txt', 'w')
        for host in esxi_host:
            print('ESXI IP:', host)
            f.write('ESXI IP: %s 
    ' % host)
            for hd in esxi_host[host]['esxi_info']:
                print('  %s:    %s' % (hd, esxi_host[host]['esxi_info'][hd]))
                f.write('  %s:    %s' % (hd, esxi_host[host]['esxi_info'][hd]))
            for ds in esxi_host[host]['datastore']:
                print('  存储名称:', ds)
                f.write('  存储名称: %s 
    ' % ds)
                for k in esxi_host[host]['datastore'][ds]:
                    print('       %s:  %s' % (k, esxi_host[host]['datastore'][ds][k]))
                    f.write('       %s:  %s 
    ' % (k, esxi_host[host]['datastore'][ds][k]))
            for nt in esxi_host[host]['network']:
                print('  网络名称:', nt)
                f.write('  网络名称:%s 
    ' % nt)
                for k in esxi_host[host]['network'][nt]:
                    print('        %s:  %s' % (k, esxi_host[host]['network'][nt][k]))
                    f.write('        %s:  %s 
    ' % (k, esxi_host[host]['network'][nt][k]))
            for vmachine in esxi_host[host]['vm']:
                print('  虚拟机名称:', vmachine)
                f.write('  虚拟机名称:%s 
    ' % vmachine)
                for k in esxi_host[host]['vm'][vmachine]:
                    print('        %s:  %s' % (k, esxi_host[host]['vm'][vmachine][k]))
                    f.write('        %s:  %s 
    ' % (k, esxi_host[host]['vm'][vmachine][k]))
        f.close()
    
    
    if __name__ == '__main__':
        main()
    
    # 脚本使用方法:
    python3 aa.py -s 192.168.254.69 -o 443 -u zabbixmonitor -p zabbixmonitor >> aa.txt
    
    # 结果
    
    ESXI IP: 192.168.254.73
      厂商:    Dell Inc.  型号:    PowerEdge R730  处理器:    数量:2 核数:24 线程数:48 频率:2200(Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz)   处理器使用率:    0.8%  内存(MB):    130978.28125  可用内存(MB):    18003.3 MB  内存使用率:    86.3%  系统:    VMware ESXi 6.5.0 build-5969303  存储名称: Localdatastore1_73
           总容量(G):  5017
           空闲容量(G):  2382
           类型:  VMFS
      网络名称:Prod_63.159.217.X
            标签ID:  Prod_63.159.217.X
      网络名称:VM Network_192.168.254.X
            标签ID:  VM Network_192.168.254.X
      虚拟机名称:platform_slave_db2
            电源状态:  poweredOn
            CPU(内核总数):  12
            内存(总数MB):  20480
            系统信息:  CentOS 6 (64-bit)
            IP:  服务器需要开机后才可以获取
            Hard disk 1:  50.0 GB
            Hard disk 2:  700.0 GB
      虚拟机名称:cbs_web04_new
            电源状态:  poweredOn
            CPU(内核总数):  12
            内存(总数MB):  12288
            系统信息:  CentOS 4/5 or later (64-bit)
            IP:  服务器需要开机后才可以获取
            Hard disk 1:  1000.0 GB
      虚拟机名称:rabbitmq_01
            电源状态:  poweredOn
            CPU(内核总数):  4
            内存(总数MB):  8192
            系统信息:  CentOS 6 (64-bit)
            IP:  服务器需要开机后才可以获取
            Hard disk 1:  50.0 GB
      虚拟机名称:dlcbs02
            电源状态:  poweredOn
            CPU(内核总数):  4
            内存(总数MB):  8192
            系统信息:  CentOS 6 (64-bit)
            IP:  服务器需要开机后才可以获取
            Hard disk 1:  50.0 GB
            Hard disk 2:  400.0 GB
      虚拟机名称:web_redis02
            电源状态:  poweredOn
            CPU(内核总数):  8
            内存(总数MB):  22528
            系统信息:  CentOS 6 (64-bit)
            IP:  服务器需要开机后才可以获取
            Hard disk 1:  50.0 GB
    ...
    
    
    监控磁盘的脚本:
    
    #!/usr/bin/python3
    #coding:utf-8
    #Author: ziming
    
    """
    只用于模拟开发功能测试
    """
    from pyVmomi import vim
    from pyVim.connect import SmartConnect, Disconnect, SmartConnectNoSSL
    import sys
    import atexit
    import argparse
    from optparse import OptionParser
    import json
    
    
    class Exsi(object):
    
        # 获取vcenter的相关参数
        def __init__(self, host = '192.168.254.69', port=443, user = 'zabbixmonitor', password='zabbixmonitor'):
            self._host = host
            self._port = port
            self._user = user
            self._password = password
    
        def get_obj(self,content, vimtype, name=None):
            '''
            列表返回,name 可以指定匹配的对象
            '''
            container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
            obj = [ view for view in container.view]
            return obj
    
        def get_conn(self):
            # 连接vcenter
            si = SmartConnectNoSSL(
                    host=self._host,
                    user=self._user,
                    pwd=self._password,
                    port=self._port)
            # disconnect this thing
            atexit.register(Disconnect, si)
            content = si.RetrieveContent()
            return content
    
        # 获取exsi的信息ip,磁盘使用情况等
        def get_esxi_host(self):
            esxi_host = {}
            content = self.get_conn()
            esxi_obj = self.get_obj(content, [vim.HostSystem])
            for esxi in esxi_obj:
                esxi_host[esxi.name] = {'datastore':{}}
    
                # for ds in esxi.datastore:
                #     esxi_host[esxi.name]['datastore'][ds.name] = {}
                #     esxi_host[esxi.name]['datastore'][ds.name]['总容量(G)'] = int((ds.summary.capacity)/1024/1024/1024)
                #     esxi_host[esxi.name]['datastore'][ds.name]['空闲容量(G)'] = int((ds.summary.freeSpace)/1024/1024/1024)
                #     esxi_host[esxi.name]['datastore'][ds.name]['类型'] = (ds.summary.type)
    
                total_capacity = 0
                free_capacity = 0
                for ds in esxi.datastore:
                    # esxi_host[esxi.name]['datastore'][ds.name] = {}
                    esxi_host[esxi.name] = {}
                    total_capacity += int((ds.summary.capacity)/1024/1024/1024)
                    free_capacity += int((ds.summary.freeSpace)/1024/1024/1024)
    
                esxi_host[esxi.name]['sotrage_used_percent'] = 100*(total_capacity - free_capacity)/total_capacity
            # print(esxi_host)
            return esxi_host
    
        # 获取exsi的host即ip列表
        def get_esxi_iplist(self):
            esxi_host = self.get_esxi_host()
            data = list()
            for exsi_ip in esxi_host:
                data.append({"{#EXSI_IP}": exsi_ip})
    
            return json.dumps({'data': data}, sort_keys=True, indent=7, separators=(",",":"))
    
        # 获取指定esxi的磁盘信息
        def get_esxi_storageinfo(self, exsi_ip):
            esxi_host = self.get_esxi_host()
    
            return esxi_host[exsi_ip]['sotrage_used_percent']
    
    
    def main():
        try:
    
            usage = "usage: %prog [options]
    gGet exsi Stat"
            parser = OptionParser(usage)
            
            # 接收参数
            parser.add_option("-l", "--list",  
                              action="store_true", dest="is_list", default=False,  help="if list all exsi ip")
            
            parser.add_option("--ip", "--ipaddr", 
                              action="store", dest="ipaddr", type="string", 
                              default="192.168.254.56", help="execute 'exsi info' to see more infomation")
            
            
            (options, args) = parser.parse_args()
            if 1 >= len(sys.argv):
                parser.print_help()
                return
            
            #exsi_ins = Exsi(options.ipaddr)
            exsi_ins = Exsi()
            if options.is_list == True:
                print(exsi_ins.get_esxi_iplist())
                return
    
            # print(redis.ins.get_esxi_storageinfo(optins.ip, exsi_ip = ip))
            print(exsi_ins.get_esxi_storageinfo(options.ipaddr))
    
        except Exception as expt:
            import traceback
            tb = traceback.format_exc()
            print(tb)
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    SpringMVC + Spring + MyBatis 学习笔记:遭遇order by 排序问题
    SpringMVC + Spring + MyBatis 学习笔记:SpringMVC和Spring一同工作的时候,AOP事务管理不起作用的解决方法
    SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
    SpringMVC + Spring + MyBatis 学习笔记:为MyBatis增加打印SQL功能 (最简化配置)
    [转]大部分人努力程度之低,根本轮不到拼天赋
    String内存陷阱简介
    同为程序员 为什么我的工资最低
    在程序员的眼里,用户是这样使用他们开发的软件的
    POI怎么和项目结合起来使用
    uploadify
  • 原文地址:https://www.cnblogs.com/reblue520/p/9643626.html
Copyright © 2011-2022 走看看