zabbix批量添加端口监控

背景

以前做监控的时候,一台机器上就几个重要端口,手动添加一下监控就可以了。这次公司一个新业务上了很多服务器,每台服务器上的业务端口很多,而且还不一样。着手动添加会累死人的。所以想zabbix怎么批量添加端口监控。通过查了资料发现 zabbix可以通过 “自动发现” 的机制来批量添加端口。

一、客户端配置

1.修改agent配置文件

开启自定义key功能

vim /usr/local/zabbix_agent/etc/zabbix_agentd.conf
#添加以下内容

AllowRoot=1

#允许用户创建自定义key
UnsafeUserParameters=1

# 自定义key key的名称为tcpport_list,后边脚本的执行结果赋值给tcpport_list
UserParameter=tcpport_list,/usr/local/zabbix_agent/shell/check_port.py

2.编写脚本

编写脚本,收集agent上的处于listen状态的端口列表

[root@node-2 ~]# cd /usr/local/zabbix_agent/
[root@node-2 zabbix_agent]# mkdir shell

解释:
脚本中{#TCP_PORT}是zabbix的LLD宏。格式就是{#自定义大写变量名}
一般用户宏是{$自定义大写变量名}

[root@node-2 shell]# cat check_port.py 
#!/usr/bin/env python
import os,json

port_list = []
zabbix_data = {}
zabbix_data_json = {}

#过滤服务器上所有listen的端口号
cmd = """netstat -anpt |awk '/LISTEN/{print $4}' |awk -F: '{print $NF}' |sort |uniq"""

port_ret = os.popen(cmd).readlines()
for port in port_ret:
    #将收集到的每个端口组成字段,然后主机到port_list列表当中
    port_list.append( {"{#TCP_PORT}": port.strip()} )

#这一步是必须的,将存 字典 的端口号的 列表 加上 data 的key 重新组成一个字段,用于返回给zabbix使用。
#data关键字也不能变,是固定的
zabbix_data["data"] = port_list

zabbix_data_json = json.dumps(zabbix_data)

#打印结果是必须的,否则值无法赋值给key
print zabbix_data_json

执行结果如下:

[root@node-2 shell]# chmod 777 ./check_port.py
[root@node-2 shell]# ./check_port.py 
{"data": [{"{#TCP_PORT}": "10050"}, {"{#TCP_PORT}": "22"}, {"{#TCP_PORT}": "25"}, {"{#TCP_PORT}": "3306"}]}

重启agent
[root@node-2 shell]# cd /etc/init.d/
[root@node-2 init.d]# bash zabbix_agentd restart

3.测试key

在服务端测试刚才自定义的key是否成功,结果如下,我们已经获取到了我摸嗯自定义的key值

[root@node-1 ~]# zabbix_get -s 192.168.1.23 -p 10050 -k tcpport_list
{"data": [{"{#TCP_PORT}": "10050"}, {"{#TCP_PORT}": "22"}, {"{#TCP_PORT}": "25"}, {"{#TCP_PORT}": "3306"}]}

可能报错如下,这个报错必须解决,如果不解决后边会报错。这个报错的原因是 在启动zabbix agent的时候使用的是zabbix用户,zabbix用户对netstat命令没有权限

[root@node-1 ~]# zabbix_get -s 192.168.1.23 -p 10050 -k tcpport_list
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
{"data": [{"{#TCP_PORT}": "10050"}, {"{#TCP_PORT}": "22"}, {"{#TCP_PORT}": "25"}, {"{#TCP_PORT}": "3306"}]}

解决办法:
在agent端执行以下命令

which netstat
chmod u+s /usr/bin/netstat 
ll /usr/bin/netstat
#发现命令变成红色,这是正常的。还有就是属主权限的x 变成了s
-rwsr-xr-x. 1 root root 155008 Aug  8  2019 /usr/bin/netstat

二、服务端配置

1.创建一个新模板

点击 模板 --> 创建模板。
zabbix批量添加端口监控_第1张图片

如上图后,点击 添加 完成模板的创建

2.创建自动发现规则

找到刚才创建的模板,点击进去,“自动发现规则” --> “创建发现规则”

zabbix批量添加端口监控_第2张图片

创建发现规则

zabbix批量添加端口监控_第3张图片

3.创建监控项原型

点击 监控项原型 。创建监控原型其实就是创建监控项

zabbix批量添加端口监控_第4张图片

创建 监控项原型
图中1处的名称的值对应{ITEM.NAME}内置变量
图中2处 {#TCP_PORT}就是客户端定义的key(tcpport_list)对的返回值。这里一定对应上

zabbix批量添加端口监控_第5张图片

4.创建触发器

在这里插入图片描述

创建触发器

zabbix批量添加端口监控_第6张图片

5.客户应用模板

zabbix批量添加端口监控_第7张图片

6.生效

1.查看策略是否生效,在主机的监控项目中查看,如下图,已经生效

zabbix批量添加端口监控_第8张图片

2.最新数据 获取数据成功。如果没有数据,不要做测试,不然触发器会报错
3.获取最新数据时间会比较长,等到有了最新的数据,在测试触发器是否生效。
4.报警信息如下:

故障告警:tcp_port  25  消失
------------------------------
告警医院:xxxxxxx
医院运维:xxxxxx
告警主机:10.xx.xxx.xx--【门诊服务app_Primary】
告警信息:check tcp port 25
当前状态:0

报警信息对应的 自定义信息格式

故障告警:{TRIGGER.NAME}   #这是引用的触发器的名称

告警医院:{$PROJECT}
医院运维:{$BPUSER}
告警主机:{HOST.CONN}--【{HOST.NAME}】
告警信息:{ITEM.NAME}     #这是引用的监控项名称
当前状态:{ITEM.VALUE1}

你可能感兴趣的:(linux,zabbix)