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 \n' % 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 \n' % ds) for k in esxi_host[host]['datastore'][ds]: print(' %s: %s' % (k, esxi_host[host]['datastore'][ds][k])) f.write(' %s: %s \n' % (k, esxi_host[host]['datastore'][ds][k])) for nt in esxi_host[host]['network']: print(' 网络名称:', nt) f.write(' 网络名称:%s \n' % nt) for k in esxi_host[host]['network'][nt]: print(' %s: %s' % (k, esxi_host[host]['network'][nt][k])) f.write(' %s: %s \n' % (k, esxi_host[host]['network'][nt][k])) for vmachine in esxi_host[host]['vm']: print(' 虚拟机名称:', vmachine) f.write(' 虚拟机名称:%s \n' % vmachine) for k in esxi_host[host]['vm'][vmachine]: print(' %s: %s' % (k, esxi_host[host]['vm'][vmachine][k])) f.write(' %s: %s \n' % (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]\ngGet 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()