企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# zabbix模板的自动发现规则(ldd)实现被监控项自动发现 ## 自动发现规则(ldd)用途说明 在zabbix自带的linux模板的自动发现规则中,有一个`Mounted filesystem discovery`自动发现规则,可以根据每个服务器磁盘梳理不同,自动生成相应的磁盘监控数据. 这就是自动注册的用途,根据不同服务器上同一个监控项不同的数量,自动生成对应数量的监控 >例如5个服务器都分别启动了tomcat多实例,但启动的tomcat数量不相同,端口也不同,我想要监控这些端口是否down掉: 用普通的方式创建的监控模板,就得给每个服务器单独创建,不能通用 而如果通过自动发现规则来创建,就可以只用一个模板,对应这些不同数量的tomcat进行端口检查 ## 自动发现规则使用实例 以监控java端口的自动发现为例,进行操作说明 流程: 1. 命令行获取结果 2. 编写zabbix脚本,输出json格式 3. 创建zabbix客户端key 4. 服务端验证结果 5. web页添加模板规则 6. web页主机绑定模板 7. 验证结果 ### 1. 命令行获取结果 首先在命令行,使用命令获取想要的结果 ```sh [root@zhimai-api02 api]# ss -lntup|grep java|awk -F "[ |:]+" '{print $6}' 9090 9091 ``` ### 2. 编写zabbix脚本,输出json格式 zabbix的api需要的都是json格式的数据,这里也不例外,不管通过shell脚本还是python脚本,反正最终需要输出json格式数据 shell脚本如下: `vim java_port_list.sh` ```sh #!/bin/bash #获取所有java服务端口,并以json格式返回 string=`ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'` count=`echo $string|wc -w` printf '{"data":[\n' for ((i=1;i<=$count;i++)) do proc_array=`echo $string |cut -d ' ' -f$i` #echo "proc"$proc_array printf "\t{\"{#PORT}\":\"${proc_array}\"},\n" done date=`date +%d%H%m%s` printf "\t{\"{#DATE}\":\"${date}\"}\n" printf "\t]\n" printf "}\n" ``` 脚本执行结果如下: ```sh [root@zhimai-api02 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh {"data":[ {"{#PORT}":"9090"}, {"{#PORT}":"9091"}, {"{#DATE}":"3117101572512518"} ] } # 最前面的data是标准语法要求的,必须要相同,后面的key可以自己定义 ``` ### 3. 创建zabbix客户端key 在`zabbix_agentd.d`目录下,创建两个自定义key,一个key用来自动发现,一个key用来作为具体监控项 ```sh [root@zhimai-api02 ~]# cat /etc/zabbix/zabbix_agentd.d/java_api.conf # 获取json列表传递给zabbix-server UserParameter=discovery.api.port,sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh # 端口状态监控key UserParameter=api.port.status[*],ss -lntup|grep "$1"|wc -l ``` 重启zabbix客户端,然后到服务端去测试验证 ```sh systemctl restart zabbix-agent.service ``` ### 4. 服务端验证结果 在zabbix服务使用zabbix-get命令验证 ```sh [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port {"data":[ {"{#DATE}":"3114101572502867"} ] } ``` 如上,没有获取到java端口信息,经查是`ss -lntup`命令中的`-p`参数,在普通用户下是看不了其他用户进程的,也就获取不到数据,可以使用免密sudo方式,也可以给`ss`命令添加`s`权限,让ss命令直接在root命令下运行 ```sh #客户端上操作 chmod +s /usr/sbin/ss ``` 再次在服务端验证: ```sh [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port {"data":[ {"{#PORT}":"9090"}, {"{#PORT}":"9091"}, {"{#DATE}":"3117101572512494"} ] } ``` 再拿获取的端口`9090`验证端口存活状态`key` ```sh [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k api.port.status[9090] 1 ``` >如上,已经能获取端口列表,也能验证改端口的状态了,可以添加规则了 ### 5. web页添加模板规则 **A 先创建模板的自动发现规则** 在web页面创建模板,进入模板的`自动发现规则`页,创建自动发现规则,主要注意`键值`和`过滤器`两项设置 [![自动发现规则](https://s2.ax1x.com/2019/10/31/KIBuo6.md.png)](https://imgchr.com/i/KIBuo6) [![过滤器](https://s2.ax1x.com/2019/10/31/KIBjfO.md.png)](https://imgchr.com/i/KIBjfO) **B 继续编写自动发现规则的监控项原型和触发器类型** [![监控项原型](https://s2.ax1x.com/2019/10/31/KIrBrj.md.png)](https://imgchr.com/i/KIrBrj) [![触发器类型](https://s2.ax1x.com/2019/10/31/KIrvsH.md.png)](https://imgchr.com/i/KIrvsH) ### 6.web页主机绑定模板 此操作过于简单,略 ### 7. 验证结果 [![自动发现结果](https://s2.ax1x.com/2019/10/31/KoFkyq.md.png)](https://imgchr.com/i/KoFkyq) ## 过程中遇到的问题: 1. json格式错误导致自动发现不了 问题:自动发现不了,zabbix-server端日志提示`became not supported` ```sh discovery rule "xxx:discovery.api.port" became not supported: Value should be a JSON object ``` 原因:这个问题经过检查,是输出的内容不是json格式导致的 2. 有多个端口/服务,但只能自动发现一个端口/服务 原因:也是由于json格式导致的 正确的应该每个key-value键值对都要用一堆大括号包起来 但输出的json格式中,却将所有的键值对只用了一个大括号包起来,如下 ```json #正确 {"data":[ {"{#PORT}":"9090"}, {"{#PORT}":"9091"} ] } #错误 {"data":[{ "{#PORT}":"9090", "{#PORT}":"9091" }] } ``` 3. 客户端执行脚本正常,服务端用zabbix-get获取数据不正确 是由于使用的命令,如`ss`,在普通用户模式下,是没有权限获取如进程信息之类数据导致的 解决办法:可以使用visudo给zabbix用户授权某些命令免密码执行,也可以给这些命令增加`s`权限,如 ```sh chmod +s /usr/sbin/ss #增加操作一定要慎重,个别可以修改数据的命令,一定不要添加s权限 ```