前言
很多情况下自定义监控项需要手动创建,重复的工作耗时耗力,全面自动化的时代如何实现同一类型的监控项批量添加。zabbix提供了自动发现的功能,实现监控项批量添加。
实现思路
- 通过脚本获取动态key并将key转换成zabbix识别的 json 格式
- 配置 zabbix agent 调用自定义脚本
- 创建自动发现规则获取json格式动态key数据
- 添加监控项原型,传入动态key变量
- 动态监控项生成(按照自动发现周期失效的key到期会自动删除)
(1)zabbix 监控linux系统端口状态
批量发现存活端口转换json格式
代码语言:javascript复制#!/bin/bash
#设置数组item为需要得到的所有监控项键值数据,变量itemnum为数据的个数
item=`netstat -ntlp|awk '{print $4}'|sed '1,2d'|awk -F ":" '{print $NF}' |sort |uniq`
itemnum=`netstat -ntlp|awk '{print $4}'|sed '1,2d'|awk -F ":" '{print $NF}' |sort |uniq |wc -l`
#输出json格式数据
num=0
echo "{""data"":["
for name in ${item[@]}
do
let num=num 1
if [ "$num" -eq "$itemnum" ]
then
echo "{""{#CONNECT}"":""${name}""}"
else
echo "{""{#CONNECT}"":""${name}""},"
fi
done
echo "]}"
测试脚本
TCP/UDP 端口监控
代码语言:javascript复制#!/bin/bash
#tcp/udp port check
ipaddr=$1
port=$2
case $3 in
tcp)
nc -z ${ipaddr} ${port} && echo 1 || echo 0
;;
udp)
nc -uz ${ipaddr} ${port} && echo 1 || echo 0
;;
esac
zabbix-agent配置
代码语言:javascript复制UnsafeUserParameters=1
UserParameter=Portdiscovery,bash /etc/zabbix/ncjson.sh
UserParameter=checkport[*],bash /etc/zabbix/nc_port.sh $1 $2 $3
zabbix_get测试
自动发现规则
监控项原型
触发器类型
最新数据
(2)zabbix批量监控目标IP连通性
IP地址列表
代码语言:javascript复制cat /etc/zabbix/ip.txt
192.168.99.12
192.168.99.22
192.168.99.50
192.168.99.55
192.168.99.99
将IP地址转换Json 格式
代码语言:javascript复制#!/bin/bash
echo -n {"data":[
i=0
for address in `cat /etc/zabbix/ip.txt`
do
if [ "$i" = "0" ]; then
echo -n "{"{#IP}":"$address"}"
else
echo -n ",{"{#IP}":"$address"}"
fi
i=`expr $i 1`
done
echo -n "]}"
脚本测试
[root@zabbix-server zabbix]# bash ipjson.sh
{"data":[{"{#IP}":"192.168.99.12"},{"{#IP}":"192.168.99.22"},{"{#IP}":"192.168.99.50"},{"{#IP}":"192.168.99.55"},{"{#IP}":"192.168.99.99"}]}
fping 探测 IP 连通性
代码语言:javascript复制#!/bin/bash
case $2 in
icmppingloss)
icmppingloss=`fping -q -c3 "$1" 2>&1 |awk -F '[/ %] ' '{print $9}'`
echo $icmppingloss
;;
icmppingsec)
icmppingsec=`fping -q -c3 "$1" 2>&1 |awk -F '[/ %] ' '{print $16}'`
if [ -z "$icmppingsec" ];then
echo "-1"
else
echo $icmppingsec
fi
;;
icmpping)
icmpping=`fping -q -c3 "$1" 2>&1 |awk -F '=' '{print $2}' |awk -F '/' '{print $2}'`
if [ $icmpping = 0 ];then
echo "0"
else
echo "1"
fi
;;
esac
脚本测试
zabbix-agent配置
代码语言:javascript复制UnsafeUserParameters=1
UserParameter=fpingdiscovery,bash /etc/zabbix/ipjson.sh
UserParameter=fping[*],bash /etc/zabbix/fping.sh $1 $2
zabbix_get测试
代码语言:javascript复制zabbix_get -s 127.0.0.1 -k fpingdiscovery
自动发现
监控项原型
最新数据
(3)zabbix 批量监控网站 web code 状态
代码语言:javascript复制#!/bin/bash
web=('www.jd.com' 'www.taobao.com' 'www.baidu.com' 'http://192.168.99.185:5601/login' 'http://192.168.99.50:6989/zabbix/index.php')
function webdiscovery(){
length=${#web[@]}
printf "{n"
printf 't'""data":["
for ((i=0;i<$length;i ))
do
printf 'ntt{'
printf ""{#NAME}":"${web[$i]}"}"
if [ $i -lt $[$length-1] ];then
printf ','
fi
done
printf "nt]n"
printf "}n"
}
function web_site_code()
{
/usr/bin/curl -I -m 10 -o /dev/null -s -w %{http_code} "$1"
}
$1 $2
脚本测试
zabbix-agent 配置
代码语言:javascript复制UnsafeUserParameters=1
UserParameter=webdiscovery,bash /etc/zabbix/webcode.sh webdiscovery
UserParameter=web_site_code[*],bash /etc/zabbix/webcode.sh web_site_code $1
zabbix-get 测试
zabbix-agent -t 检查监控项是否正常
注意:创建监控项原型(键值[]中的数值必须大写,否则会报错如下)
Cannot create item: item with the same key "*********" already exists