通过Zabbix的自动发现(规则)自动创建监控项

下图是一个已配置并启用的自动发现规则:

1552289524930

应用到165.194这个主机后,自动发现的监控项:

1552292766307

服务端配置


  • 创建Template

1552289699169

1552291377011

  • 创建Discovery rule

1552290037822

1552290165972

1552290648939

键值readPorts跟被监控端配置的参数有关,下面再提。

  • 创建监控项原型

1552290398568

1552290435754

1552290764479

宏引用符号{ #SERVICE }和{ #TCP_PORT }跟被监控端返回的json数据有关。net.tcp.listen[<port>]表示监听目标机器的<port>端口状态,返回值为0或1,0表示Down,1表示Up。另外,$1表示键值里的第一个参数,即<port>

1552291332721

  • 创建触发器原型

1552291459399

1552291553384

1552291665378

1552291704285

1552291742293

添加完监控项和触发器原型的样子:

1552291961703

  • 添加主机并关联此模板

    此略。


被监控端配置

首先,看一下/etc/zabbix目录下的文件。scripts目录是新加的,zabbix_agentd.conf也作了修改。

1552292968159

使用自动发现功能,需要返回符号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]# cat readPorts.sh 
#!/bin/sh

mypath=$(cd `dirname $0`; pwd)
cat $mypath/ports.json

为了返回给server端,需要再zabbix_agentd.conf中配置:

1552293926733

这样,server端就可以使用readPorts这个键值,以获取写在ports.json中的数据。readPorts下面定义的getPorts、getAllPorts是另外两个可用的自定义键值。

自动发现需监控的服务/端口,难点不在于读取,而在于自动生成json数据文件。此处的ports.json是根据ports.ini转换而来的。

ports.ini文件需人工填写:

1552295007248

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
#!/usr/bin/env python
#coding:utf-8
import os, json, re


mypath = 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)

# json_str已是json字符串,但每行尾部有一个多余的空格,zabbix不接受,须删除行尾空格
p = re.compile("\s+$")
for line in json_str.split('\n'):
ss = re.sub(p, "", line)
print ss

转换ports.ini为json形式:

1552294366863

至于getAllPorts.py,它的功能是直接返回主机上实际开放的端口数据:

1552294862652