背景
监控生产环境服务的时候,通常需要对多个端口进行监控,手动一个个添加会让我们崩溃,所以批量添加端口就是一个非常常见的需求。
解决方案
1、准备脚本
准备端口自发现脚本,check_port.py
#!/usr/bin/env python
#coding:utf-8
import os, json
port_list=[]
port_dict={"data":None}
cmd='''''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq 2>/dev/null'''
local_ports=os.popen(cmd).readlines()
for port in local_ports:
pdict={}
pdict["{#TCP_PORT}"]=port.replace("\n", "")
port_list.append(pdict)
port_dict["data"]=port_list
jsonStr = json.dumps(port_dict, sort_keys=True, indent=4)
print jsonStr
脚本的作用:就是从被监控的服务器上面采集数据,并且转换为特定的字典格式,这种格式是Zabbix可以识别的一种数据字典格式。
准备完成后,将脚本放至/etc/zabbix/scripts 路径下。
2、配置文件
修改被监控端的zabbix_agent2.conf配置文件(或者在zabbix_agent2.d下新建,看自己习惯),新增KEY值tcp.port
[root@zabbix-agent ~]# vim /etc/zabbix/zabbix_agent2.d/port.conf
UserParameter=tcp.port,/etc/zabbix/scripts/check_port.py
3、重启服务
重启agent端的zabbix服务
[root@zabbix-agent ~]# systemctl restart zabbix-agent
4、测试
在服务端使用zabbix_get工具测试,或者在agent执行脚本测试
[root@receive scripts]# python /etc/zabbix/scripts/check_port.py
出现类似以下内容(返回json格式的合法端口号),说明成功
{
"data": [
{
"{#TCP_PORT}": "9071"
},
{
"{#TCP_PORT}": "9072"
},
{
"{#TCP_PORT}": "9073"
},
{
"{#TCP_PORT}": "5555"
}
]
}
5、Zabbix-Web界面配置
新建模版
新建自动发现规则
注意键值的一致性
新建监控项原型
新建触发器
最后将此新建的模版关联需要的主机就可以了。
优化脚本
有时候我们不需要监控自动扫描出来的所有端口,所以我们需要自己指定端口,这个需求是比较常见的。
我们需要将脚本替换成下列脚本就可以了,在portlist中添加我们想要监控的端口。
脚本展示
#!/usr/bin/env python
#coding:utf-8
import os, json
portlist=["9071",
"9072",
"9073",
"5555"]
port_list=[]
port_dict={"data":None}
for port in portlist:
pdict={}
pdict["{#TCP_PORT}"]=port
port_list.append(pdict)
port_dict["data"]=port_list
jsonStr = json.dumps(port_dict, sort_keys=True, indent=4)
print jsonStr
数据展示
问题展示
加入媒介,根据需求实现钉钉、微信报警即可。