下图是一个已配置并启用的自动发现规则:
应用到165.194这个主机后,自动发现的监控项:
服务端配置
键值readPorts跟被监控端配置的参数有关,下面再提。
宏引用符号{ #SERVICE }和{ #TCP_PORT }跟被监控端返回的json数据有关。net.tcp.listen[<port>]表示监听目标机器的<port>端口状态,返回值为0或1,0表示Down,1表示Up。另外,$1表示键值里的第一个参数,即<port>。
添加完监控项和触发器原型的样子:
被监控端配置 首先,看一下/etc/zabbix目录下的文件。scripts目录是新加的,zabbix_agentd.conf也作了修改。
使用自动发现功能,需要返回符号zabbix要求的json数据:
例如:
1 2 3 4 5 6 7 8 9 10 11 12 { "data" : [ { "{#SERVICE}" : "phjd_mysql" , "{#TCP_PORT}" : "28001" }, { "{#SERVICE}" : "philips_taxfree_tuangou_payment_management" , "{#TCP_PORT}" : "16200" } ] }
其形式大致如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 { "data" : [ { "{#KEY01}" : "value01_01" , "{#KEY02}" : "value01_02" , "{#KEY03}" : "value01_03" , ... }, { "{#KEY01}" : "value02_01" , "{#KEY02}" : "value02_02" , "{#KEY02}" : "value02_03" , ... }, ... ] }
readPorts.sh脚本的内容很简单,就是读取已准备好的json数据文件ports.json,作为返回给zabbix server的值:
1 2 3 4 5 [root@172 scripts] #!/bin/sh mypath=$(cd `dirname $0 `; pwd ) cat $mypath /ports.json
为了返回给server端,需要再zabbix_agentd.conf中配置:
这样,server端就可以使用readPorts这个键值,以获取写在ports.json中的数据。readPorts下面定义的getPorts、getAllPorts是另外两个可用的自定义键值。
自动发现需监控的服务/端口,难点不在于读取,而在于自动生成json数据文件。此处的ports.json是根据ports.ini转换而来的。
ports.ini文件需人工填写:
getPorts.py脚本如下,用于转换ports.ini为ports.json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import os, json, remypath = os.path.dirname(os.path.realpath(__file__)) port_list = [] port_dict = {"data" :None } with open('%s/ports.ini' % mypath, 'r' ) as f: for line in f.readlines(): line = line.strip() if line: try : port_srv = line.split(':' ) port_list.append({"{#TCP_PORT}" : port_srv[1 ].strip(), "{#SERVICE}" : port_srv[0 ].strip()}) except : pass port_dict["data" ] = port_list json_str = json.dumps(port_dict, sort_keys=True , indent=4 ) p = re.compile("\s+$" ) for line in json_str.split('\n' ): ss = re.sub(p, "" , line) print ss
转换ports.ini为json形式:
至于getAllPorts.py,它的功能是直接返回主机上实际开放的端口数据: