研究了半天,终于搞定了zabbix添加自定义的“自动发现”。
目前实现了自动获取lvs服务器上的vip以及realserver的当前连接数的监控。我们之前通过ipvsadm的输出,对每个vip和realser的连接数做监控,但是由于这两个都是经常发生变化的,尤其是realserver,经常会出现添加或者修改的事,这样在zabbix上做它们连接数的监控就会消耗人力,每次变更的同时,都要去zabbix上去修改item的配置。
所以,研究了一下zabbix的自动发现。
入正题,ipvsadm的输出如下:
[root@openstack lvs]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.255.253.223:80 wrr
-> 10.255.253.220:80 Route 100 0 0
实际上,我们要做的就是对10.255.253.223:80以及10.255.253.220:80后面的ActiveConn 和InActConn的和做监控(这里都是0)。
首先,你要先抛开“自动发现”,你应该先实现在不使用自动发现的情况下,拿到数据是正常的。于是就有了这个脚本:
[root@openstack lvs]# cat lvs_connections
#!/bin/bash
if [ $# -eq 1 ]
then
VIP_PORT=$1
else
echo “Usage:$0 VIP:VPORT”
exit 1
fi
case ${VIP_PORT} in
all)
ALL_con=`tail -n14 /proc/net/ip_vs|awk ‘{if (($3 == “Route”)){printf $5″+”$6″+”}}’`
echo $((${ALL_con}0))
;;
*)
NOW_con=`tail -n14 /proc/net/ip_vs|awk ‘{if (($1 == “TCP” || $1 == “UDP”)){printf “\n”$2″�C”}else{ if (($3 == “Route”)){printf $5″+”$6″+”}}}’`
for VIP_PORT_16 in `tail -n14 /proc/net/ip_vs|awk ‘/^TCP/||/^UDP/ {print $2}’`
do
VIP_10=`echo ${VIP_PORT_16%%:*} | awk ‘{for(i=1;i<=NF;i++) $i=strtonum(“0x”$i);print}’ FIELDWIDTHS=”2 2 2 2″ OFS=”.”`
VPORT_10=`echo $((16#${VIP_PORT_16##*:}))`
VIP_VPORT=`echo ${VIP_10}:${VPORT_10}`
if [ ${VIP_VPORT} = ${VIP_PORT} ]
then
connect=`tail -n14 /proc/net/ip_vs|awk ‘{if (($1 == “TCP” || $1 == “UDP”)){printf “\n”$2″�C”}else{ if (($3 == “Route”)){printf $5″+”$6″+”}}}’|grep “${VIP_PORT_16}”|awk -F�C ‘{print $2}’`
Connect_num=`echo “${connect}0″`
echo “$((${Connect_num}))”
fi
done
for RIP_PORT_16 in `tail -n14 /proc/net/ip_vs|awk ‘/Route/ {print $2}’`
do
RIP_10=`echo ${RIP_PORT_16%%:*} | awk ‘{for(i=1;i<=NF;i++) $i=strtonum(“0x”$i);print}’ FIELDWIDTHS=”2 2 2 2″ OFS=”.”`
RPORT_10=`echo $((16#${RIP_PORT_16##*:}))`
RIP_RPORT=`echo ${RIP_10}:${RPORT_10}`
if [ ${RIP_RPORT} = ${VIP_PORT} ]
then
connect=`tail -n14 /proc/net/ip_vs|grep ${RIP_PORT_16}|awk ‘{printf $5″+”$6″+”}’`
Connect_num=`echo “${connect}0″`
echo “$((${Connect_num}))”
fi
done
;;
esac
######################
[root@openstack lvs]# ./lvs_connections 10.255.253.223:80
0
[root@openstack lvs]#
这样就能拿到“10.255.253.223:80”的连接数是0,但是由于10.255.253.223:80是不固定的,所以就引入了自动发现。前提是lvs_connections已经融入了zabbix监控。
接下来,我们为自动发现写个脚本,
[root@openstack lvs]# cat lvs_ip_discovery
#!/bin/bash
echo ‘{“data”:[{"{#IP}":"10.255.253.223:80"},{"{#IP}":"10.255.253.220:80"},{"{#IP}":"10.255.253.221:80"}]}’
这里投机了,最终其实是要以上面的输出方式,拿到当前服务器的ipvsadm的相关信息。
同时也要将这个脚本融入zabbix,相关的配置如下:
UserParameter=lvs.connect[*],/bin/bash /usr/local/zabbix/etc/script/lvs/lvs_connections $1
UserParameter=lvs.ip.discovery,/bin/bash /usr/local/zabbix/etc/script/lvs/lvs_ip_discovery
好了,接下来,就是怎么搞定zabbix前端的配置了。
首先,进入Template�CDiscovery rules�CCreate discovery rules�C
NAME里填discovery IP
KEY里填lvs.ip.discovery
Filter的Macro里填{#IP}
其他可以默认
好了,规则添加好了,接下来就是怎么让规则和item关联起来了。
在你刚建好的discovery IP里面的items中新建一个items,
Name里填connect of $1
key里填lvs.connect[{#IP}]
其他的可以默认,好了。完成了。
=============================
其实说白了,自动发现是自动发现,与之前添加的item互不影响,只需要一个“{#IP}”把他们关联起来。