监控生产环境的服务时候,通常需要对多个端口进行监控,如果手动一个一个添加,这样则会台麻烦,这里可以选择批量添加端口监控,对于zabbix是支持的,需要使用zabbix的Discovery功能实现。
一、自动扫描端口并监控报警
- 编写脚本:check_port.py
脚本的作用就是从被监控的服务器上面采集数据,然后转换为特定的字典格式,这种格式是zabbix可以识别的一种数据字典格式,使用python来编写相对shell来说更加便捷
在被监控的客户端中的/usr/local/zabbix/shell路径下写入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
注:给新建脚本赋权限:
[root@localhost shell]# chmod +x check_port.py
- 修改被监控端的zabbix_agent.conf配置文件
在配置文件中更改:
[root@localhost ~]# vim /etc/zabbix/zabbix_agentd.conf
287 UnsafeUserParameters=1
296 UserParameter=tcpportlisten,/usr/local/zabbix/shell/check_port.py
- 重启zabbix-agent服务
[root@localhost ~]# systemctl restart zabbix-agent.service
- 在zabbix的server端测试
[root@localhost ~]# zabbix_get -s 192.168.88.137 -p 10050 -k tcpportlisten
出现下面则说明脚本运行成功
注:如果出现zabbix-get:command not found…,则需要安装zabbix-get服务
[root@localhost ~]# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm #配置yum源
[root@localhost ~]# yum install zabbix-get.x86_64
二、页面配置
-
添加模板
-
添加自动发现规则
在新建的模板中的自动发现规则,选择创建发现规则
上面中的key一定要和配置文件中的key保持一致,这是在zabbix_agent.conf中添加两行代码中第二行添加的参数key
- 创建监控原型
上面中键值的{#TCP_PORT}和脚本check_port.py中的参数一致
- 添加触发器类型
注意上面的表达式中的count(#3,0,eq)>1表示最近3次的返回值为0,这个条件出发一次则报警
配置完这里,就完成了zabbix自动扫描并监控的功能
三、批量添加监听指定端口
有时候不需要监控自动扫描出来的所有端口,只需要监控指定的端口,如需要实现这个功能,只需要将脚本替换成下面内容即可:
#!/usr/bin/env python
#coding:utf-8
import os, json
portlist=["3306",
"80",
"22"]
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 portlist:
pdict={}
pdict["{#TCP_PORT}"]=port
#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
将check_port.py内容替换成以上代码,就可以实现批量监控指定端口