之前写过一个帖子,是如何完美监控ESXi节点的硬盘的,没想到效果那么好。最近好多朋友过来问面包肿么配置。说实话我也是太懒了,所以就把这个脚本优化了一下,一不小心没有刹住车,把CPU、内存、硬盘、网卡流量什么的都监控出来了,哦,对了,还有虚拟机在节点上占用的空间(主要是因为我使用的大多是本地的空间,然后没有一个完美的曲线展示是节点上哪个虚拟机增长量过快导致的本地空间耗费,对运维是有很大隐患的)。然后本来前天v2.0版都已经写好了,上线了!但是发现了一些性能上面的问题,最后没有发布。经过两天的奋笔疾书,终于最新版的v2.0诞生了,监控脚本内容介绍: 
081200ghf1ja9zf2199f49.png 

config.ini : 配置文件
cpu_mem_info.py : 取CPU值的脚本
get_disk_info.py : 取硬盘相关信息的脚本
main.py : 主的运行文件
traffic.py : 网络流量监控文件
vm_info.py : 虚拟机在节点占用空间获取脚本
zabbix_send.py : 向zabbix send数据的脚本


OK,介绍过脚本作用之后,开始来说一下肿么配置吧!主要是修改"config.ini":
081532gh48ycllouo8ug4c.png 

上面是固定的格式:

[VCenter01] ------> 主要是VC应用的别名,用于日志上面报错的时候好识别
host:VC的IP地址,格式:10.10.10.10
user :  VC的用户名,格式:mianbao
password:VC用户的密码,格式:mianbao.cn.com


注:上面的host、user、password这些项名是不能修改的!
你有几个VC就写几个上面的结构就行,zabbix我就不再多说了,切记 '[zabbix]'是不能修改的哦!


然后就是准备环境了,所需环境 Centos 或 Window都可以,这里只说一下Centos的环境准备方法,只需安装所需要的python以来模块,安装方法如下:

unzip pysphere-0.1.8.zipcd pysphere-0.1.8python setup.py install


OK,安装过程是不是简单的有点让人恐怖,接下来验证一下,所安装的环境是否OK:
082435efyugutg8t88rasv.png 
如果没有报错,OK那就是安装完成了,然后把脚本下载之后放到一个目录里面,运行如下命令就可以收集监控项了:

python main.py

But,在爽之前别忘记了在zabbix上面还需要做相关的配置,主要分为两大块:
1.模板
2.host
1.模板已为大家准备好了,请下载导入即可:
zabbix 2.0 模板: 


2.host大家可以通过两种方式添加,一种是自己手动添加,另外一种就是discovery。不会配置的小朋友们要认真做功课了~

一切配置停当,并且有数值了,那么在linux的crontab中添加如下定时任务即可:

*/5 * * * * /usr/bin/python /vmware/main.py

温馨提示:
初次使用脚本的友友们,请运行两次之后再去看数据!因为zabbix第一次会根据send过去的key去建立item,所以第一次会有一半是失败的,第二次就OK了!

附件上传不上来,我直接把代码公布出来吧!

Config.ini

  1. [VCenter01]
  2. host = VC IP地址(ex:10.10.10.10
  3. user = VC 用户名
  4. password = VC 用户密码
  5. [VCenter02]
  6. host = VC IP地址(ex:10.10.10.11
  7. user = VC 用户名
  8. password = VC 用户密码
  9. [VCenter03]
  10. host = VC IP地址(ex:10.10.10.12
  11. user = VC 用户名
  12. password = VC 用户密码
  13. [zabbix]
  14. host = Zabbix服务器地址
  15. port = 10051

cpu_mem_info.py

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016年6月14日
  4.  
  5. @author: MianBao
  6. @author_web: Mianbao.cn.com
  7. '''
  8. import copy
  9. from pysphere import VIServer,VIProperty
  10. from zabbix_send import zabbix_sender
  11. def getNodeinfo(s,zabbix_info):
  12.     properties = [
  13.     'summary.config.name',
  14.     'summary.quickStats.overallCpuUsage',
  15.     'summary.quickStats.overallMemoryUsage',
  16.     'summary.hardware.cpuMhz',
  17.     'summary.hardware.memorySize',
  18.     'summary.hardware.numCpuCores',
  19.     'summary.hardware.numCpuPkgs',
  20.     ]
  21.     
  22.     props = s._retrieve_properties_traversal(property_names=properties,obj_type="HostSystem")
  23.     total = {}
  24.     for item in props:
  25.         host = dict()
  26.         for p in item.PropSet:
  27.             if p.Name == 'summary.config.name':
  28.                 host_name = p.Val
  29.             if p.Name == 'summary.quickStats.overallCpuUsage':
  30.                 cpu_use = p.Val
  31.             if p.Name == 'summary.quickStats.overallMemoryUsage':
  32.                 memroy_use = p.Val
  33.             if p.Name == 'summary.hardware.cpuMhz':
  34.                 cpu_hz = p.Val
  35.             if p.Name == 'summary.hardware.memorySize':
  36.                 memory_total = p.Val
  37.             if p.Name == 'summary.hardware.numCpuCores':
  38.                 cpu_core = p.Val
  39.             if p.Name == 'summary.hardware.numCpuPkgs':
  40.                 cpu_num = p.Val
  41.                 
  42.         host['cpu_use'] = cpu_use
  43.         host['memory_use'] = memroy_use
  44.         host['cpu_hz'] = cpu_hz * cpu_core
  45.         host['memory_total'] = memory_total
  46.         host['cpu_core'] = cpu_core
  47.         host['cpu_num'] = cpu_num
  48.         total[host_name] = host
  49.         host = dict()
  50.     #print total
  51.     SendDataToZabbix(total,zabbix_info)
  52.  
  53. def SendDataToZabbix(total,zabbix_info):
  54.     for x,y in total.items():
  55.         value = dict()
  56.         value['host'] = x
  57.         zabbix=zabbix_sender(**zabbix_info)
  58.         
  59.         value['key'] = 'cpu.info'
  60.         value['value'] = '{"data":[{"{#DATA}":"CPU"}]}'
  61.         zabbix.adddata(**copy.deepcopy(value))
  62.         
  63.         value['key'] = 'cpu.use.hz[CPU]'
  64.         value['value'] = y.get('cpu_use')
  65.         zabbix.adddata(**copy.deepcopy(value))
  66.         
  67.         value['key'] = 'cpu.physical.core[CPU]'
  68.         value['value'] = y.get('cpu_core')
  69.         zabbix.adddata(**copy.deepcopy(value))
  70.         
  71.         value['key'] = 'cpu.total.hz[CPU]'
  72.         value['value'] = y.get('cpu_hz')
  73.         zabbix.adddata(**copy.deepcopy(value))
  74.         
  75.         value['key'] = 'cpu.chacao.num[CPU]'
  76.         value['value'] = y.get('cpu_num')
  77.         zabbix.adddata(**copy.deepcopy(value))
  78.         
  79.         value['key'] = 'cpu.vcpu.num[CPU]'
  80.         value['value'] = y.get('cpu_num') * y.get('cpu_core'
  81.         zabbix.adddata(**copy.deepcopy(value))
  82.         
  83.         response=zabbix.send()
  84.         #print 'memory----',response
  85.         
  86.         zabbix_memory=zabbix_sender(**zabbix_info)
  87.         
  88.         value['key'] = 'memory.info'
  89.         value['value'] = '{"data":[{"{#DATA}":"MEMORY"}]}'
  90.         zabbix_memory.adddata(**copy.deepcopy(value))
  91.         
  92.         value['key'] = 'memory.use.mb[MEMORY]'
  93.         value['value'] = y.get('memory_use') * 1024 * 1024
  94.         zabbix_memory.adddata(**copy.deepcopy(value))
  95.         
  96.         value['key'] = 'memory.total.bytes[MEMORY]'
  97.         value['value'] = y.get('memory_total'
  98.         zabbix_memory.adddata(**copy.deepcopy(value))
  99.         
  100.         response=zabbix_memory.send()
  101.         #print 'cpu----',response
  102.     return response

get_disk_info.py:

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016年6月14日
  4.  
  5. @author: MianBao
  6. @author_web: Mianbao.cn.com
  7. '''
  8. import os
  9. import ssl
  10. import copy
  11. import json
  12. from pysphere import VIServer,VIProperty
  13. from zabbix_send import zabbix_sender
  14. import time
  15. def HostSystem(s):
  16.     properties = [
  17.     'summary.config.name',
  18.     'datastore',
  19.     ]
  20.     props = s._retrieve_properties_traversal(property_names=properties,obj_type="HostSystem")
  21.     host = dict()
  22.     for item in props:
  23.         for p in item.PropSet:
  24.             if p.Name == 'datastore':
  25.                 datastore_id = p.Val.ManagedObjectReference
  26.             if p.Name == 'summary.config.name':
  27.                 host_ip = p.Val
  28.         for x in datastore_id:
  29.             host[str(x)] = host_ip
  30.     return host
  31. def DatatStore(s):
  32.     properties = [
  33.     'summary.capacity',
  34.     'summary.freeSpace',
  35.     'summary.name',
  36.     'summary.uncommitted',
  37.     ]
  38.     props = s._retrieve_properties_traversal(property_names=properties,obj_type="Datastore")
  39.     host = dict()
  40.     for item in props:
  41.         disk = dict()
  42.         for p in item.PropSet:
  43.             if p.Name == 'summary.capacity':
  44.                 total = p.Val
  45.             if p.Name == 'summary.freeSpace':
  46.                 free = p.Val
  47.             if p.Name == 'summary.name':
  48.                 name = p.Val
  49.             if p.Name == 'summary.uncommitted':
  50.                 uncommitted = p.Val
  51.         disk['total'] = total
  52.         disk['free'] = free
  53.         disk['name'] = name
  54.         #disk['uncommitted'] = uncommitted
  55.         host[name] = disk
  56.     return host
  57. def Get_Datastore(s):
  58.     return s.get_datastores()
  59. def MergeAndSend(s,zabbixs):
  60.     host = HostSystem(s)
  61.     disk = DatatStore(s)
  62.     middle = Get_Datastore(s)
  63.     hosts = dict()
  64.     for M,N in host.items():
  65.         X = middle.get(M)
  66.         Y = disk.get(X)
  67.         zabbix_send_content(N,Y,zabbixs)
  68.     return hosts
  69.     
  70. def zabbix_send_content(host,cont_dict,zabbixs):
  71.     if isinstance(cont_dict, dict):
  72.         zabbix=zabbix_sender(**zabbixs)
  73.         
  74.         #the discovery rules
  75.         value = dict()
  76.         value['host'] = host
  77.         value['key'] = 'vmware.disk.name'
  78.         value['value'] = '{"data":[{"{#DATA}":"%s"}]}' % cont_dict.get('name')
  79.         zabbix.adddata(**copy.deepcopy(value))
  80.         
  81.         value['key'] = 'vmware.disk.free[%s]' % cont_dict.get('name')
  82.         value['value'] = '%s' % cont_dict.get('free')
  83.         zabbix.adddata(**copy.deepcopy(value))
  84.         
  85.         value['key'] = 'vmware.disk.total[%s]' % cont_dict.get('name')
  86.         value['value'] = '%s' % cont_dict.get('total')
  87.         zabbix.adddata(**copy.deepcopy(value))
  88.         
  89.         response=zabbix.send()
  90.         #print 'disk----',response
  91.         return response
  92. if '__main__' == __name__:
  93.     pass

main.py:

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016.11.14
  4.  
  5. @author: MianBao
  6. @author_web: Mianbao.cn.com
  7. '''
  8. import os
  9. import ssl
  10. import logging
  11. import ConfigParser
  12. import threading
  13. import time
  14. from pysphere import VIServer
  15. from get_disk_info import MergeAndSend
  16. from cpu_mem_info import getNodeinfo
  17. from vm_info import main
  18. from traffic import NetTraffic
  19. class MianBao():
  20.     def __init__(self):
  21.         self.now_path = os.path.dirname(__file__)
  22.         self.vcinfo = None
  23.     
  24.     def GetConfig(self):
  25.         config = dict()
  26.         config_items = ['host''user''password']
  27.         config_zabbix_items = ['host''port']
  28.         
  29.         file = os.path.join(self.now_path,'config.ini')
  30.         
  31.         Cfile = ConfigParser.ConfigParser()
  32.         Cfile.read(file)
  33.         Cfile_zone = Cfile.sections()
  34.         
  35.         for C in Cfile_zone:
  36.             zone_config = dict()
  37.             config_items = config_zabbix_items if C == 'zabbix' else ['host''user''password']
  38.             try:
  39.                 for Y in config_items:
  40.                     zone_config[Y] = Cfile.get(C,Y)
  41.             except Exception,e:
  42.                 self.logs('config read',e.message)
  43.                 pass
  44.             config[C] = zone_config
  45.         self.vcinfo=config
  46.             
  47.     def logs(self,where,log): 
  48.         log_name = os.path.join(self.now_path,'main.log')
  49.         logger = logging.getLogger(where)
  50.         logger.setLevel(logging.DEBUG)
  51.         fh = logging.FileHandler(log_name)
  52.         fh.setLevel(logging.DEBUG)
  53.         formatter = logging.Formatter('%(asctime)s - %(filename)s:%(lineno)s - %(name)s - %(message)s' )
  54.         fh.setFormatter(formatter)
  55.         logger.addHandler(fh)
  56.         logger.debug(log)
  57.         
  58.     def Connect(self,zone,vc):
  59.         # windows need import the ssl
  60.         try:
  61.             ssl._create_default_https_context = ssl._create_unverified_context
  62.         except Exception,e:
  63.             pass
  64.         
  65.         self.Server = VIServer()
  66.         try:
  67.             self.Server.connect(**vc)
  68.         except Exception,e:
  69.             self.logs('%s VC 连接错误' % zone,e.message)
  70.         return self.Server if self.Server.is_connected() else  1
  71.     
  72.     
  73.     def Run(self):
  74.         self.GetConfig()
  75.         if self.vcinfo is not None:
  76.             zabbix = self.vcinfo.get('zabbix',None)
  77.             for zone,vc in self.vcinfo.items():
  78.                 if zone != 'zabbix' and zabbix != None:
  79.                     S = self.Connect(zone,vc)
  80.                     try:
  81.                         MergeAndSend(S,zabbix)
  82.                         getNodeinfo(S,zabbix)
  83.                         main(S,zabbix)
  84.                         NetTraffic(S,zabbix)
  85.                         S.disconnect()
  86.                     except Exception,e:
  87.                         self.logs('%s VC 连接错误' % zone,e.message)
  88.                         pass
  89.                     
  90.     
  91.     
  92.     
  93. if '__main__' == __name__:
  94.     collor = MianBao()
  95.     collor.Run()


traffic.py:

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016.11.14
  4.  
  5. @author: MianBao
  6. @author_web: Mianbao.cn.com
  7. '''
  8. import copy
  9. from pysphere import VIServer,VIProperty
  10. from zabbix_send import zabbix_sender
  11. import time
  12. def NetTraffic(s,zabbix_info):
  13.    
  14.     pm = s.get_performance_manager()
  15.     get_key = ['net.bytesTx''net.bytesRx']
  16.     
  17.     for x,y in s.get_hosts().items():
  18.         
  19.         network_type = dict()
  20.         
  21.         for M in get_key:
  22.             network_traffic = dict()
  23.             start  =  time.clock()
  24.             nettx_out = pm.get_entity_statistic(x,M)
  25.             end = time.clock()
  26.             for nettxtraffic in nettx_out:
  27.                 nettxinstance = dict((name, getattr(nettxtraffic, name)) for name in dir(nettxtraffic) if not name.startswith('__'))
  28.                 if nettxinstance['instance'] != "":
  29.                     netname = nettxinstance['instance']
  30.                     nettxtraffic = nettxinstance['value']
  31.                     network_traffic[netname] = nettxtraffic
  32.             network_type[M] = network_traffic
  33.         
  34.         #print "traffic use time:",end - start  
  35.         MergeNetName(network_type,y,zabbix_info)
  36.     
  37. def MergeNetName(network_type,y,zabbix_info):
  38.     if isinstance(network_type,dict):
  39.         for m,n in network_type.get('net.bytesTx').items():
  40.             network_in = network_type.get('net.bytesRx').get(m)
  41.             UpToZabbix(y,m,n,network_in,zabbix_info)
  42. def UpToZabbix(y,net_name,out,net_in,zabbix_info):
  43.     zabbix_traffic=zabbix_sender(**zabbix_info)
  44.     value = dict()
  45.     value['host'] = y
  46.     value['key'] = 'traffic.info'
  47.     value['value'] = '{"data":[{"{#DATA}":"%s"}]}' % net_name
  48.     zabbix_traffic.adddata(**copy.deepcopy(value))
  49.     
  50.     value['key'] = 'traffic.net.out.kb[%s]' % net_name
  51.     value['value'] = out
  52.     zabbix_traffic.adddata(**copy.deepcopy(value))
  53.     
  54.     value['key'] = 'traffic.net.in.kb[%s]' % net_name
  55.     value['value'] = net_in
  56.     zabbix_traffic.adddata(**copy.deepcopy(value))
  57.     
  58.     response=zabbix_traffic.send()
  59.     #print 'traffic----',response

vm_info.py:

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016614
  4.  
  5. @author: MianBao
  6. @author_web: Mianbao.cn.com
  7. '''
  8. import copy
  9. import ssl
  10. from pysphere import VIServer,VIProperty
  11. from zabbix_send import zabbix_sender
  12. import time
  13. def GetNodeInfo(Server):
  14.     managed_object_types = 'VirtualMachine'
  15.     properties = [
  16.     'summary.runtime.host',
  17.     'summary.storage.committed',
  18.     'name',
  19.     ]
  20.     props = Server._retrieve_properties_traversal(property_names=properties,obj_type=managed_object_types)
  21.     vms = dict()
  22.     for item in props:
  23.         vm = {}
  24.         host_id = None
  25.         for p in item.PropSet:
  26.             if p.Name == 'summary.runtime.host':
  27.                 if vms.get(p.Val,None):
  28.                     host_id = p.Val
  29.             vm[p.Name] = p.Val
  30.         if host_id:
  31.             vms[host_id].append(vm)
  32.         else:
  33.             vms[vm['summary.runtime.host']] = [vm,]
  34.     return vms
  35.             
  36. def GetHosts(s):
  37.     hosts = s.get_hosts()
  38.     return hosts
  39. def main(s,zabbix_info):
  40.     start = time.clock()
  41.     hosts = GetHosts(s)
  42.     vms = GetNodeInfo(s)
  43.     for x,y in vms.items():
  44.         for m in y:
  45.             response = SendData(x,m,hosts,zabbix_info)
  46.     end = time.clock()
  47.     #print 'vm use time:',end - start
  48.     return response
  49. def SendData(x,m,hosts,zabbix_info):
  50.     zabbix_vm = zabbix_sender(**zabbix_info)
  51.     
  52.     value = dict()
  53.     value['host'] = hosts.get(x,None)
  54.     value['key'] = 'vmware.vm'
  55.     vm_name = m.get('name')
  56.     value['value'] = '{"data":[{"{#DATA}":"%s"}]}' % str(vm_name)
  57.     zabbix_vm.adddata(**copy.deepcopy(value))
  58.     for key,val in m.items():
  59.         if key not in ['summary.runtime.host','name',]:
  60.             value['key'] = '%s[%s]' % (key, vm_name)
  61.             value['value'] = val
  62.             zabbix_vm.adddata(**copy.deepcopy(value))
  63.     
  64.     response=zabbix_vm.send()
  65.     return response