由于应用场景多样化,而zabbix自带的模板并不能满足各种应用的监控需求,本文则是实现自动发现并监控端口方法,其中脚本文件包括python和shell两个版本,建议采用已实现自定义端口范围python版本。
编写自动发现端口的脚本
将脚本保存至zabbix_agent.conf中配置的扩展脚本目录中,并赋予执行权限。
Python版本
#!/usr/bin/python3 import os import json data = {} tcp_list = [] port_list = [] s = ['8080','8180','8280','8380','8480','8580','8680','8780','8880','8980'] ss = [] command = "netstat -tnlp | egrep -i tcp | awk {'print $4'} | awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}' | sort|uniq" lines = os.popen(command).readlines() for line in lines: port = line.split() port_list.append(port[0]) for i in port_list: if i in s: ss.append(i) for port in list(set(ss)): port_dict = {} port_dict['{#TCP_PORT}'] = port tcp_list.append(port_dict) data['data'] = tcp_list jsonStr = json.dumps(data, sort_keys=True, indent=4) print (jsonStr)
Shell版本
Shell版本没有限定端口范围,建议在模板中添加“过滤器”规则。
#!/bin/bash portarray=(`netstat -tnlp | egrep -i "$1" | awk {'print $4'} | awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}' | sort|uniq`) length=${#portarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#TCP_PORT}\":\"${portarray[$i]}\"}" [ $i -lt $[$length-1] ] && printf ',' done printf "\n\t]\n" printf "}\n"
配置zabbix-agent
修改配置/etc/zabbix/zabbix_agentd.conf,并添加相关参数,保存后重启zabbix-agent。
UnsafeUserParameters=1 # Python版本 UserParameter=discover_tcp_port,/opt/zabbix/scripts/discover_tcp_ports.py "$1" # Shell版本 # UserParameter=discover_tcp_port,/opt/zabbix/scripts/discover_tcp_ports.sh "$1"
测试
在zabbix-proxy或zabbix-server执行如下命令进行测试:
zabbix_get -s 10.10.100.101 -k discover_tcp_port
能获取端口数据则表示脚本执行成功,但提示:
Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.
原因是netstat执行权限的问题,在客户端执行如下命令即可:
chmod +s /bin/netstat
配置zabbix模板
配置自动发现模板的大至过程如下:
- 创建zabbix模板
- 创建自动发现规则
- 创建监控项原形,键值:discover_tcp_port
- 创建触发器类型
原创文章禁止转载:技术学堂 » Zabbix使用手册:创建自动发现规则并监控应用端口