查看: 2415|回复: 4

[Zabbix] 面包ESXi 硬盘监控脚本使用方法详解

[复制链接]

440

主题

642

帖子

5080

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5080
发表于 2016-6-20 10:22:44 | 显示全部楼层 |阅读模式
上一个帖子是我草草写完的,所以里面还有很多地方不是很清楚,所以今天重新记录一下,其中配置的过程我这里就不再多说,请大家看上一个帖子:
【需VC】Zabbix 完美监控VMware ESXi 的硬盘 http://mianbao.cn.com/forum.php?mod=viewthread&tid=172&fromuid=1

请注意:因此脚本依赖pysphere模块,所以请至最后查看安装pysphere模块的方法!

上面的附件大家就不要下载了,里面的脚本是没有经过优化的,一会我会把优化过的脚本放出来,并说明详细的使用过程。主要优化了多VC的支持和脚本格式,脚本如下:

  1. #-*- coding:utf-8 -*-
  2. '''
  3. @Created on 2016年6月14日

  4. @author: MianBao

  5. @author_web: Mianbao.cn.com

  6. '''
  7. import os
  8. import ssl
  9. import copy
  10. import json
  11. from pysphere import VIServer,VIProperty
  12. from zabbix_send import zabbix_sender



  13. def Connect(ip,user,pwd):
  14.     # windows need import the ssl
  15.     try:
  16.         ssl._create_default_https_context = ssl._create_unverified_context
  17.     except Exception,e:
  18.         pass
  19.    
  20.     Server = VIServer()
  21.     try:
  22.         Server.connect(ip, user, pwd)
  23.     except Exception,e:
  24.         print e.message
  25.     return Server if Server.is_connected() else  1

  26. def GetNodeIdList(server):
  27.     all_data_dict = dict()
  28.     hosts = server.get_hosts()
  29.     for disk_mor,disk_name in hosts.items():
  30.         p = VIProperty(server, disk_mor)
  31.         for ds in p.datastore:
  32.             disk_name_value_list = all_data_dict.get(disk_name,None)
  33.             if disk_name_value_list:
  34.                 disk_name_value_list.append(ds._obj)
  35.             else:
  36.                 new = list()
  37.                 new.append(ds._obj)
  38.                 all_data_dict[disk_name] = new
  39.     return all_data_dict
  40.    
  41. def GetNodeDiskUse(server):
  42.     all_data_dict = dict()
  43.     for ds_mor, name in server.get_datastores().items():
  44.         props = VIProperty(server, ds_mor)
  45.         new=dict()
  46.         new['name'] = name
  47.         new['total'] = props.summary.capacity
  48.         new['free'] = props.summary.freeSpace
  49.         new['datastore_id'] = ds_mor
  50.         all_data_dict[ds_mor] = new
  51.     return all_data_dict

  52. def MergeIdUse(id_dict,use_dict,zabbix):
  53.     if isinstance(id_dict, dict) and isinstance(use_dict, dict):
  54.         for key,val in id_dict.items():
  55.             for x in val:
  56.                 id_use_dict = use_dict.get(x,None)
  57.                 if id_use_dict:
  58.                     id_use_dict['host'] = key
  59.                     rs = zabbix_send_content(id_use_dict,zabbix)
  60.                     print rs

  61. def zabbix_send_content(cont_dict,zabbix):
  62.     if isinstance(cont_dict, dict):
  63.         zabbix=zabbix_sender(**zabbix)
  64.         
  65.         #the discovery rules
  66.         value = dict()
  67.         value['host'] = cont_dict.get('host')
  68.         value['key'] = 'vmware.disk.name'
  69.         value['value'] = '{"data":[{"{#DATA}":"%s"}]}' % cont_dict.get('name')
  70.         zabbix.adddata(**copy.deepcopy(value))
  71.         
  72.         value['key'] = 'vmware.disk.free[%s]' % cont_dict.get('name')
  73.         value['value'] = '%s' % cont_dict.get('free')
  74.         zabbix.adddata(**copy.deepcopy(value))
  75.         
  76.         value['key'] = 'vmware.disk.total[%s]' % cont_dict.get('name')
  77.         value['value'] = '%s' % cont_dict.get('total')
  78.         zabbix.adddata(**copy.deepcopy(value))
  79.         
  80.         response=zabbix.send()
  81.         return response



  82. if '__main__' == __name__:
  83.    
  84.     vc_login_info = [
  85.                      {'ip':'1.1.1.1','user':'zabbix','pwd':'mianbao.cn.com'},
  86.                      {'ip':'2.2.2.2','user':'zabbix','pwd':'mianbao.cn.com'},
  87.                     ]
  88.    
  89.     zabbix_info = {'host':'5.5.5.5','port':10050,}
  90.    
  91.     for vc_login in vc_login_info:
  92.         server = Connect(**vc_login)
  93.         node_data = GetNodeIdList(server)
  94.         name_data = GetNodeDiskUse(server)
  95.         node_disk = MergeIdUse(node_data, name_data,zabbix_info)
  96.         server.disconnect()
复制代码
使用时请注意以下配置:
1.VC的配置,请给需监控的VC新增一个只读的用户(),并按照上面的格式填写。
2.zabbix_info里面的关于zabbix的设置,后面的端口一定不要用引号。
3.建议使用面包提供的模板,这样你就可以不用修改discovery的key和item的key直接就可以使用了。

接下来我们来看一下zabbix_sender这个脚本的内容:
  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import struct
  4. import json
  5. import socket



  6. class zabbix_sender:
  7.    
  8.     def __init__(self,host,port):
  9.             self.zbx_server_host=host
  10.             self.zbx_server_port=port
  11.             self.zbx_header='ZBXD'
  12.             self.zbx_protocols_version=1
  13.             self.zbx_send_value={'request':'sender data','data':[]}

  14.     def adddata(self,host,key,value):
  15.             add_data={'host':host,'key':key,'value':value}
  16.             self.zbx_send_value['data'].append(add_data)

  17.     def makesenddata(self):
  18.             zbx_send_json=json.dumps(self.zbx_send_value)
  19.             zbx_send_json_len=len(zbx_send_json)
  20.             self.zbx_send_data=struct.pack("<4sBq"+str(zbx_send_json_len)+"s",'ZBXD',1,zbx_send_json_len,zbx_send_json)
  21.    
  22.     def send(self):
  23.             self.makesenddata()
  24.             zbx_server_socket=socket.socket()
  25.             zbx_server_socket.connect((self.zbx_server_host,self.zbx_server_port))
  26.             zbx_server_write_df=zbx_server_socket.makefile('wb')
  27.             zbx_server_write_df.write(self.zbx_send_data)
  28.             zbx_server_write_df.close()
  29.             zbx_server_read_df=zbx_server_socket.makefile('rb')
  30.             zbx_response_package=zbx_server_read_df.read()
  31.             zbx_server_read_df.close()
  32.             zbx_response_data=struct.unpack("<4sBq"+str(len(zbx_response_package) - struct.calcsize("<4sBq"))+"s",zbx_response_package)
  33.             return zbx_response_data[3]

  34. if __name__ == '__main__':
  35.     pass
复制代码
OK,两个脚本的内如上所示,如果按照上面的方法配置好了之后,然后添加定时任务:
  1. */5 * * * * /usr/bin/python /usr/local/zabbix/script/get_disk_info.py
复制代码
然后手动的执行一下看看执行的输出:
  1. {"response":"success","info":"processed: 3; failed: 0; total: 3; seconds spent: 0.003739"}
复制代码
请注意看上面的failed,如果为0的话,说明就全部执行成功了!
至此整个监控的配置过程已配置完毕了,如果还有什么问题请加面包群进行询问:

面包屑群二维码.png
注:本群仅解答本站所提供的帖子的解决方法中的疑问,其他问题如有能力会尽量帮助。询问方法入下:
1.发送看到的帖子至群中,把你要询问的问题跟在帖子中,站长会亲自进行解答!(为了避免大家提共同的问题,形成一个沉淀,所以请大家尽量把问题以发帖子的形式发出来!)

选一人白头,择一城终老
回复

使用道具 举报

440

主题

642

帖子

5080

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5080
 楼主| 发表于 2016-6-20 10:46:34 | 显示全部楼层

依赖模块pysphere安装

因脚本的监控需要一个pysphere的python模块,所以大家还需要安装一下,如果有pip的话直接使用pip安装即可:
  1. pip install -U pysphere
复制代码
如果没有pip的话,也不用安装,我们就采用安装包的方式安装一下,安装方法如下:
  1. unzip pysphere-0.1.8.zip
  2. cd pysphere-0.1.8
  3. python setup.py install
复制代码
安装包下载:
pysphere-0.1.8.zip (526.23 KB, 下载次数: 93)
选一人白头,择一城终老
回复 支持 反对

使用道具 举报

440

主题

642

帖子

5080

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5080
 楼主| 发表于 2016-6-20 11:09:57 | 显示全部楼层
模板下载,内涵设置好的discovery rules

Mianbao_ESXi_Disk.xml

11.08 KB, 下载次数: 31

选一人白头,择一城终老
回复 支持 反对

使用道具 举报

0

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2016-10-26 15:55:03 | 显示全部楼层
goodgoodgood
回复 支持 反对

使用道具 举报

0

主题

17

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2017-3-10 09:38:26 | 显示全部楼层
厉害!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_sctz! !jz_fhlb!
快速回复 返回顶部 返回列表