|
上一个帖子是我草草写完的,所以里面还有很多地方不是很清楚,所以今天重新记录一下,其中配置的过程我这里就不再多说,请大家看上一个帖子:
【需VC】Zabbix 完美监控VMware ESXi 的硬盘 http://mianbao.cn.com/forum.php?mod=viewthread&tid=172&fromuid=1
请注意:因此脚本依赖pysphere模块,所以请至最后查看安装pysphere模块的方法!
上面的附件大家就不要下载了,里面的脚本是没有经过优化的,一会我会把优化过的脚本放出来,并说明详细的使用过程。主要优化了多VC的支持和脚本格式,脚本如下:
- #-*- coding:utf-8 -*-
- '''
- @Created on 2016年6月14日
-
- @author: MianBao
- @author_web: Mianbao.cn.com
- '''
- import os
- import ssl
- import copy
- import json
- from pysphere import VIServer,VIProperty
- from zabbix_send import zabbix_sender
- def Connect(ip,user,pwd):
- # windows need import the ssl
- try:
- ssl._create_default_https_context = ssl._create_unverified_context
- except Exception,e:
- pass
-
- Server = VIServer()
- try:
- Server.connect(ip, user, pwd)
- except Exception,e:
- print e.message
- return Server if Server.is_connected() else 1
- def GetNodeIdList(server):
- all_data_dict = dict()
- hosts = server.get_hosts()
- for disk_mor,disk_name in hosts.items():
- p = VIProperty(server, disk_mor)
- for ds in p.datastore:
- disk_name_value_list = all_data_dict.get(disk_name,None)
- if disk_name_value_list:
- disk_name_value_list.append(ds._obj)
- else:
- new = list()
- new.append(ds._obj)
- all_data_dict[disk_name] = new
- return all_data_dict
-
- def GetNodeDiskUse(server):
- all_data_dict = dict()
- for ds_mor, name in server.get_datastores().items():
- props = VIProperty(server, ds_mor)
- new=dict()
- new['name'] = name
- new['total'] = props.summary.capacity
- new['free'] = props.summary.freeSpace
- new['datastore_id'] = ds_mor
- all_data_dict[ds_mor] = new
- return all_data_dict
- def MergeIdUse(id_dict,use_dict,zabbix):
- if isinstance(id_dict, dict) and isinstance(use_dict, dict):
- for key,val in id_dict.items():
- for x in val:
- id_use_dict = use_dict.get(x,None)
- if id_use_dict:
- id_use_dict['host'] = key
- rs = zabbix_send_content(id_use_dict,zabbix)
- print rs
- def zabbix_send_content(cont_dict,zabbix):
- if isinstance(cont_dict, dict):
- zabbix=zabbix_sender(**zabbix)
-
- #the discovery rules
- value = dict()
- value['host'] = cont_dict.get('host')
- value['key'] = 'vmware.disk.name'
- value['value'] = '{"data":[{"{#DATA}":"%s"}]}' % cont_dict.get('name')
- zabbix.adddata(**copy.deepcopy(value))
-
- value['key'] = 'vmware.disk.free[%s]' % cont_dict.get('name')
- value['value'] = '%s' % cont_dict.get('free')
- zabbix.adddata(**copy.deepcopy(value))
-
- value['key'] = 'vmware.disk.total[%s]' % cont_dict.get('name')
- value['value'] = '%s' % cont_dict.get('total')
- zabbix.adddata(**copy.deepcopy(value))
-
- response=zabbix.send()
- return response
- if '__main__' == __name__:
-
- vc_login_info = [
- {'ip':'1.1.1.1','user':'zabbix','pwd':'mianbao.cn.com'},
- {'ip':'2.2.2.2','user':'zabbix','pwd':'mianbao.cn.com'},
- ]
-
- zabbix_info = {'host':'5.5.5.5','port':10050,}
-
- for vc_login in vc_login_info:
- server = Connect(**vc_login)
- node_data = GetNodeIdList(server)
- name_data = GetNodeDiskUse(server)
- node_disk = MergeIdUse(node_data, name_data,zabbix_info)
- server.disconnect()
复制代码 使用时请注意以下配置:
1.VC的配置,请给需监控的VC新增一个只读的用户(),并按照上面的格式填写。
2.zabbix_info里面的关于zabbix的设置,后面的端口一定不要用引号。
3.建议使用面包提供的模板,这样你就可以不用修改discovery的key和item的key直接就可以使用了。
接下来我们来看一下zabbix_sender这个脚本的内容:- #!/usr/bin/env python
- #coding:utf-8
- import struct
- import json
- import socket
- class zabbix_sender:
-
- def __init__(self,host,port):
- self.zbx_server_host=host
- self.zbx_server_port=port
- self.zbx_header='ZBXD'
- self.zbx_protocols_version=1
- self.zbx_send_value={'request':'sender data','data':[]}
- def adddata(self,host,key,value):
- add_data={'host':host,'key':key,'value':value}
- self.zbx_send_value['data'].append(add_data)
- def makesenddata(self):
- zbx_send_json=json.dumps(self.zbx_send_value)
- zbx_send_json_len=len(zbx_send_json)
- self.zbx_send_data=struct.pack("<4sBq"+str(zbx_send_json_len)+"s",'ZBXD',1,zbx_send_json_len,zbx_send_json)
-
- def send(self):
- self.makesenddata()
- zbx_server_socket=socket.socket()
- zbx_server_socket.connect((self.zbx_server_host,self.zbx_server_port))
- zbx_server_write_df=zbx_server_socket.makefile('wb')
- zbx_server_write_df.write(self.zbx_send_data)
- zbx_server_write_df.close()
- zbx_server_read_df=zbx_server_socket.makefile('rb')
- zbx_response_package=zbx_server_read_df.read()
- zbx_server_read_df.close()
- zbx_response_data=struct.unpack("<4sBq"+str(len(zbx_response_package) - struct.calcsize("<4sBq"))+"s",zbx_response_package)
- return zbx_response_data[3]
- if __name__ == '__main__':
- pass
复制代码 OK,两个脚本的内如上所示,如果按照上面的方法配置好了之后,然后添加定时任务:
- */5 * * * * /usr/bin/python /usr/local/zabbix/script/get_disk_info.py
复制代码 然后手动的执行一下看看执行的输出:
- {"response":"success","info":"processed: 3; failed: 0; total: 3; seconds spent: 0.003739"}
复制代码 请注意看上面的failed,如果为0的话,说明就全部执行成功了!
至此整个监控的配置过程已配置完毕了,如果还有什么问题请加面包群进行询问:
注:本群仅解答本站所提供的帖子的解决方法中的疑问,其他问题如有能力会尽量帮助。询问方法入下:
1.发送看到的帖子至群中,把你要询问的问题跟在帖子中,站长会亲自进行解答!(为了避免大家提共同的问题,形成一个沉淀,所以请大家尽量把问题以发帖子的形式发出来!)
|
|