利用zabbix的自动发现功能自动发现tomcat端口号并添加监控及告警
一、简介
zabbix的自动发现功能需要传输的数据为json格式的,可以使用Python格式json.dump进行json格式化,也可以使用shell,利用printf,进行打印出json格式的回显。所以,自动发现功能可以有Python书写,也可以由shell进行书写。
二、相关的脚本
Shell版本
#!/bin/bash # Time : 2019/6/3 # Author : "郁唯" ##shell书写的自动发现端口号的脚本 ##exclude_port这些进程是不需要的,如果需要屏蔽检测某些进程的端口,只需要在下面|grep CloudResetPwdUpdateAgent的后面,在添加|grep -v xxxx 即可。 exclude_port=$(ps -ef |grep java |grep CloudResetPwdUpdateAgent |awk '{ print $2 }'|xargs |sed 's/ /\|/g') ##使用if判断下exclude_port是否为空,如果为空的话,egrep会报错。 if [[ $exclude_port = "" ]];then ##下面的命令中必须用sudo的权限启动,可以在/etc/sudoers 中添加一行以只是zabbix使用sudo权限“zabbix ALL=(ALL) NOPASSWD: ALL” portarray=(`/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`) else ##将需要的java端口检索出来。添加egrep -v 是为了屏蔽某些不需要的进程,所有的端口号,都会在下面的这个变量里面,但是将所>有的端口取出来需要使用:${portarray[@]} portarray=(`/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|egrep -v $exclude_port|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`) #下面可以加上sudo的使用方法,不过centos好像直接root权限,ubuntu需要设置zabbix的启动权限。 #portarray=(`sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq`) fi length=${#portarray[@]} printf "{\n" printf '\t'"\"data\":[" for ((i=0;i<$length;i++)) do printf '\n\t\t{' printf "\"{#JAVA_PORT}\":\"${portarray[$i]}\"}" if [ $i -lt $[$length-1] ];then printf ',' fi done printf "\n\t]\n" printf "}\n"
Python版本是python3
#!/usr/bin/env python # -*- coding: utf-8 -*- # __Time__ : 2019/6/3 # __Author__ : "郁唯" import os import subprocess import simplejson as json #由于系统中可能会有一些不想被检测的java程序,所以用下面的变量给过滤下不想检测的。 Exclude_port=subprocess.getoutput("ps -ef |grep java |grep CloudResetPwdUpdateAgent |awk '{ print $2 }'|xargs |sed 's/ /\|/g'") #判断Exclude_port是否为空,如果是空的话,就不能使用egrep -v命令进行排除了,因为egrep不能什么都不接 if Exclude_port == "": Java_port = "/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq" else: Java_port = "/usr/bin/sudo /bin/netstat -tnlp|egrep -i java|egrep -v %s|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq" % Exclude_port t=subprocess.getoutput(Java_port) tomcats=[] for tomcat in t.split('\n'): if len(tomcat) != 0: tomcats.append({'{#JAVA_PORT}':tomcat}) # # 打印出zabbix可识别的json格式 print(json.dumps({'data':tomcats},sort_keys=True,indent=4,separators=(',',':')))
注意:
1、以上两种版本的脚本都需要添加执行权限,或者是在执行的时候使用/bin/bash discovery.sh 或者/usr/bin/python3 discovery.py
2、使用netstat命令输出端口号;-tnlp=Tcp协议+不显示别名+listen状态+显示程序名称;$1~$9表示输出的第几个参数;awk {'print $4'}表示输出第4个参数(如0.0.0.0:80);awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}表示截取冒号后面的值,且只能是0~9的数字;|sort|uniq表示排序和去重。
三、配置zabbix客户端并测试
在zabbix客户端的配置文件(/usr/bin/zabbix_agentd/etc/zabbix_agentd.con)中添加字段
UnsafeUserParameters=1 UserParameter=javaport,/usr/local/zabbix_agent/sbin/discovery.sh "$1"
修改完成后重启zabbix_agentd 服务。
/etc/init.d/zabbix_agentd restart
在服务端测试能否获取到自动发现的端口号
/usr/local/zabbix/bin/zabbix_get -s 192.168.x.xx -p 10050 -k "javaport" ###如果返回以下内容表示能自动发现端口号; ###如果不能正确返回,请自行检查zabbix客户端的日志文件,看报错,还可以在终端中自行执行,看能否返回如下格式的数据 { "data":[ { "{#JAVA_PORT}":"17300" }, { "{#JAVA_PORT}":"17500" }, { "{#JAVA_PORT}":"18091" } ] }
四、zabbix的web页面配置自动发现
1、zabbix前端页面中创建一个Template
2、创建完成后进入该Template,创建Applications,
3、点击Discovery rules选项,然后创建自动发现规则
下面是我创建的规则:
其中key那个地方字段一定要填为“三”中配置的“UserParameter=javaport”的javaport
4、创建完成后,点击Item prototypes选项创建监控项
下面是我创建完成的监控项
填好框中的选项之后,点击Add选项,即可创建监控项;
5、下面开始创建告警规则。
点击上图中的创建Create trigger prototype
在上图的第二个框中,可以点击add进行添加“Expression”,点击Add选项之后,出现下图
然后点击红色框选中的选项,既可快速的选中监控项,在上图中的Result中,选择自己的所需要的规则,比如我监控的端口在zabbix客户端处如果端口存在返回1,端口不存在返回0,所以,我的规则是不等于1就告警“{Tomcat_service_monitor:net.tcp.listen[{#JAVA_PORT}].last()}<>1”
6、添加图形
这个图形,如果需要的话,可以监控,如果不需要,就不添加。
至此自动发现的规则就填写完毕。
六、在主机中关联此模板
可以在下面的红线框中输入Template名称然后就会自动出现,然后添加即可。点击add之后,需要在点击update,进行更新。
添加完成之后,可以在“Configure”》》“Hosts”》》“items”中看到下图的内容,表示添加监控已经成功了
然后查看下graph
也能在graphs中看到监控的状态。
很完美的完成了自动发现端口并且监控的规则。
七、说一下碰到的问题吧。
1、执行脚本的时候发现提示 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用户启动的zabbix服务,默认没有执行netstat命令的权限,有两种解决方法:
###第一种,在/etc/sudoers 中添加一条命令 #Defaults requiretty 注释掉这个 zabbix ALL=(ALL) NOPASSWD: ALL ###第二种,是给所使用的命令赋予s的权限 chmod +s /bin/netstat #“chmod +s”命令的含义是:为了方便普通用户执行一些特权命令,SUID/SGID程序允许普通用户以root身份暂时执行该程序,并在执行结束后再恢复身份。
2、添加自动发现端口后出现报错“Value should be a JSON object.”的报错
可能的原因也是上面的那个报错引起的
“http://www.voidcn.com/article/p-npjtgyco-bpa.html”上面的这个链接给了一个完美的解答,在此借鉴一下;
也有可能是下面的这个原因
后记:本文是本人亲手测试之后书写而成,其中的一些脚本可能有借鉴网上某兄弟的脚本的成分,在此感谢被借鉴的朋友。
- 点赞
- 收藏
- 关注作者
评论(0)