在监控生产环境的服务的时候,通常需要对多个端口进行监控,如果我们手动一个一个的添加,这将是一件很麻烦的事情,为了减少这样的情况,我们采用批量添加监控端口的方法,这是非常常见的需求,zabbix也是支持这种方式的,需要使用zabbix的Discovery功能来实现。
使用zabbix监控如何监控服务器端口状态,大概的流程:zabbix监控服务自带端口监控的监控项,所以需要我们自己手动定义所监控的item,客户端获取的端口列表通过agent传送到服务端。
只需在服务端进行端口监控模板配置,然后自定义监控图形,添加监控项即可!
下面就给大家讲解一下批量添加端口的方法。
一 自动扫描端口并监控报警
1. 编写脚本扫描端口
vim check_port.py
#!/usr/bin/env python
import os
import json
portlist = []
new_port_list = []
port_dict = {"data":None}
cmd = '''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|'''
cmd += '''awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort -n| uniq 2>/dev/null'''
auto_localport = os.popen(cmd).readlines()
for ports in auto_localport:
new_port = ports.strip()
portlist.append(new_port)
for port in portlist:
pdict = {}
pdict["{#TCP_PORT}"] = port
new_port_list.append(pdict)
port_dict["data"] = new_port_list
jsonStr = json.dumps(port_dict,sort_keys=True,indent=4)
#python3
#print(jsonStr)
#python2
print jsonStr
脚本的作用就是从被监控的服务器上面采集数据,并且转换为特定的字典格式,这种格式是zabbix可以识别的一种数据字典格式,使用python来编写相对shell来说更加便捷。
在/etc/zabbix/zabbix_agentd.d/下创建目录externalscripts
mkdir -p /etc/zabbix/zabbix_agentd.d/externalscripts
将脚本放在客户端 /etc/zabbix/zabbix_agentd.d/externalscripts 路径下面。并赋予执行权限。
[root@mysql-master externalscripts]# chmod +x check_port.py
[root@mysql-master externalscripts]# ll -a check_port.py
-rwxr-xr-x. 1 root root 672 Jul 1 01:25 check_port.py
2. 在 /etc/zabbix/zabbix_agentd.d/ 下创建 userparameter_checkport.conf 文件,并编辑。内容如下:
[root@mysql-master zabbix_agentd.d]# more userparameter_checkport.conf
UserParameter=tcpport.listen,/etc/zabbix/zabbix_agentd.d/externalscripts/check_port.py
敢这么做是因为:
通常在zabbix_agentd.conf文件中有这段代码 include zabbix_agentd.d/*.conf。(如果注释掉的话就解除注释)
重启客户端服务。
[root@mysql-master ~]# systemctl restart zabbix-agent.service
3. 服务端测试
执行命令: zabbix_get -s 192.168.158.141 -p 10050 -k tcpport.listen
会发现zabbix报错,报错信息:(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
解决方法:
zabbix_agentd端执行命令
chmod +s /bin/netstat
服务端再次使用zabbix_get 测试,便不会有报错信息。
出现上面格式的数据,说明脚本编写成功!!!
如果客户端对check_port.py赋权方式采用的 chmod u+x check_port.py 即-rwxr--r-- 则,在服务端zabbix_get进行测试时,会报没有权限。如下所示:
[root@zabbix_nginx ~]# zabbix_get -s 192.168.158.141 -p 10050 -k tcpport.listen
sh: /etc/zabbix/zabbix_agentd.d/externalscripts/check_port.py: Permission denied
二 页面配置
1. 创建端口监控专用主机群组
配置 > 主机群组 > 创建主机群组
2. 创建模板
配置 > 模板 > 创建模板
3. 添加自动发现规则
在上面创建的模板中点击 ----> 自动发现规则 ----> 然后选择创建发现规则
说明:上面的key 一定要和监控客户端配置文件中的 key 保持一致。
4. 创建监控项原型
创建自动发现规则后,点击该规则下的 “监控项原型” ----> 创建监控项原型
上面中的键值中的 {#TCP_PORT} 和我们的脚本 check_port.py 中的参数一致
5. 创建触发器原型
其中,表达式详情如图:
注意,这里的表达式中的 count(#3,0,eq) > 1表示最近3次的返回值为0,这个条件触发一次则报警。
配置到这里我们就完成了,zabbix自动扫描并监控的功能。
三 将端口监控模板链接到相关主机
将端口监控模板链接到相关主机上即可