zabbix 自动发现

2021-09-15 10:41:36 浏览数 (1)

前言

很多情况下自定义监控项需要手动创建,重复的工作耗时耗力,全面自动化的时代如何实现同一类型的监控项批量添加。zabbix提供了自动发现的功能,实现监控项批量添加。

实现思路

  1. 通过脚本获取动态key并将key转换成zabbix识别的 json 格式
  2. 配置 zabbix agent 调用自定义脚本
  3. 创建自动发现规则获取json格式动态key数据
  4. 添加监控项原型,传入动态key变量
  5. 动态监控项生成(按照自动发现周期失效的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

0 人点赞