研究了半天,终于搞定了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″–”}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″–”}else{ if (($3 == “Route”)){printf $5″+”$6″+”}}}’|grep “${VIP_PORT_16}”|awk -F– ‘{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–Discovery rules–Create discovery rules–

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}”把他们关联起来。