前言:

        通过这篇文章你可以学会用shell写相关采集器推送脚本,推送自动发现规则所需json格式数据,以及推送自动发现的监控项数据。在zabbix原生监控项无法实现的时候非常有用,当然使用外部脚本也是一样哦,只不过是换了zabbix监控项的监控模式而已。采集器属于主动模式监控哦,因为是zabbix_sender主动推送给zabbix server的,所以对于效率很高、server负载也低。在创建触发器时大部分都是数值判断,在对于返回字符串时要去怎么判断是否异常呢,比如监控项返回字符串是OK_(5)、90%,第一种先说监控项值OK_(5)这种形式如何创建触发器,触发器函数那里自带str函数可以实现关键字匹配,匹配到返回1反之返回0。第二种监控项值为90%如何创建触发器呢,就需要使用监控项的预处理功能,将%去除就可以了,监控项预处理功能中右裁剪功能实现。

      我希望通过这个文章大家要知道举一反三,深刻理解zabbix自动发现机制,除了采集器类型还有其他主动、被动、外部脚本、snmp agent的自动发现规则都是类似的,只不过snmp的自动发现特殊一点点,后面有机会发表相关文章。

实例:

      监控神州云科DCN-4250(Dell EMC Unity400存储),由于不支持snmp agent模式监控所以只能通过unisphere cli工具来获取相关信息,有需要的可以留言或私聊,

shell 脚本

下面是完整脚本,我后面以个别举例说明,不用看全部的哦,

#!/bin/bash
#下面为正则切割内容
#uemcli -d *.*.*.* -u admin -p xxxxxx /env/bat show |awk '/^[0-9]+:.+spb_bbu_0\>/,/.*Health[[:space:]]state/ {print $0}'
#echo "客户端地址为:$1"

zbx_ip="x.x.x.x"
zbx_port=10051
client_ip="*.*.*.*"
client_user="*****"
client_pwd="******"


#返回自动发现规则需要的json格式数据
jsonput(){
	i=1
	echo -e "{\n\t\"data\":["
	for j in $*
	do
		echo -e "\t\t{\n\t\t\"{#ETHNAME}\":\"$j\""
		echo -en "\t\t}"
		if ((i<$#))
		then
			echo  "," 
		fi
		i=$i+1
	done
	echo -e "\n\t]"
	echo "}"
}


#推送到zabbix
zbx_sender(){
	zabbix_sender -z $zbx_ip -p $zbx_port -s $client_ip -k $1 -o $2
}

#传输参数:命令、自动发现键值前缀、监控项键值前缀、单个指标信息相关行数(偏移量方便分割)、
putstatuszbx(){
        cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd"
        alllist=`$cmdstar $1`
        #输出以太网网卡ID列表
        IDlist=`echo "$alllist"|grep "^[0-9]:.*ID"|awk -F "= " '{print$2}'`
        Namelist=`echo "$alllist"|grep "Name"|awk -F "= " '{print$2}'|tr ' ' '-'`

        #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json原始格式输出
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix
        zbx_sender "$2" $bb         #推送自动发现json数据
        #echo "$aa"  
        #echo "$bb"

	
        for i in $IDlist
        do
                eth=`echo "$alllist"|grep  $i  -A $4`
                ethname=`echo "$eth"|grep "Name"|awk -F"= " '{print $2}'|tr ' ' '-'`
                ethstatus=`echo "$eth"|grep "Health state"|awk -F"= " '{print $2}'`
#                echo "状态输出 $ethname $ethstatus"
                ww=`echo "$3.[$ethname]"`
                qq=`echo $ethstatus|tr ' ' '_'`
#                echo "监控项原形输出:$ww $qq"
                zbx_sender  $ww $qq
                #zbx_sender  $ww "no"
                echo "---------"
        done
}

#传输参数:命令、自动发现键值前缀、监控项键值前缀、单个指标信息相关行数(偏移量方便分割)、
pool_putstatuszbx(){
        cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd"
        alllist=`$cmdstar $1`
        #输出以太网网卡ID列表
        IDlist=`echo "$alllist"|grep "^[0-9]:.*ID"|awk -F "= " '{print$2}'`
        Namelist=`echo "$alllist"|grep "Name"|awk -F "= " '{print$2}'|tr ' ' '-'`
        #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json原始格式输出
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix
        zbx_sender "$2" $bb         #推送自动发现json数据
        #echo "$aa"  
        #echo "$bb"

	
        for i in $IDlist
        do
                eth=`echo "$alllist"|grep $i -A $4`
                #echo "$eth"
		ethname=`echo "$eth"|grep "Name"|awk -F"= " '{print $2}'|tr ' ' '-'`
                ethstatus=`echo "$eth"|grep "Subscription percent"|awk -F"= " '{print $2}'`
#                echo "状态输出 $ethname $ethstatus"
                ww=`echo "$3.[$ethname]"`
                qq=`echo $ethstatus|tr ' ' '_'`
                #echo "监控项原形输出:$ww $qq"
                zbx_sender  $ww $qq
                #zbx_sender  $ww "no"
                echo "---------"
        done
}

#传输参数:命令、自动发现键值前缀、监控项键值前缀、单个指标信息相关行数(偏移量方便分割)、
#主要用于输出电池SP状态
sp_putstatuszbx(){
        cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd"
        alllist=`$cmdstar $1`
        #输出以太网网卡ID列表
        IDlist=`echo "$alllist"|grep "^[0-9]:.*ID"|awk -F "= " '{print$2}'`
        Namelist=`echo "$alllist"|grep "SP"|awk -F "= " '{print$2}'|tr ' ' '-'`

        #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json原始格式输出
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix
        zbx_sender "$2" $bb         #推送自动发现json数据
#        echo "$aa"  
#        echo "$bb"


        for i in $IDlist
        do
                eth=`echo "$alllist"|grep  $i  -A $4`
                ethname=`echo "$eth"|grep "SP"|awk -F"= " '{print $2}'|tr ' ' '-'`
                ethstatus=`echo "$eth"|grep "Health state"|awk -F"= " '{print $2}'`
#                echo "状态输出 $ethname $ethstatus"
                ww=`echo "$3.[$ethname]"`
                qq=`echo $ethstatus|tr ' ' '_'`
#                echo "监控项原形输出:$ww $qq"
                zbx_sender  $ww $qq
                echo "---------"
        done
}

#传输参数:命令、自动发现键值前缀、监控项键值前缀、单个指标信息相关行数(偏移量方便分割)、
#主要用于输出电源、存储处理器、硬盘状态
ps_putstatuszbx(){
        cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd"
        alllist=`$cmdstar $1`
        #输出以太网网卡ID列表
        IDlist=`echo "$alllist"|grep "^[0-9]*:.*ID"|awk -F "= " '{print$2}'`
        Namelist=`echo "$alllist"|grep "^[0-9]*:.*ID"|awk -F "= " '{print$2}'|tr ' ' '-'`

        #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json原始格式输出
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix
        zbx_sender "$2" $bb         #推送自动发现json数据
        #echo "$aa"  
        #echo "$bb"

        for i in $IDlist
        do
                eth=`echo "$alllist"|grep  "$i\>"  -A $4`
                ethname=`echo "$eth"|grep "^[0-9]*:.*ID"|awk -F"= " '{print $2}'|tr ' ' '-'`
                ethstatus=`echo "$eth"|grep "Health state"|awk -F"= " '{print $2}'`
                #echo "状态输出 $ethname $ethstatus"
                ww=`echo "$3.[$ethname]"`
                qq=`echo $ethstatus|tr ' ' '_'`
                #echo "监控项原形输出:$ww $qq"
                zbx_sender  $ww $qq
                echo "---------"
        done
}


echo "推送sas接口状态"
putstatuszbx "/net/port/sas show" "sas.list"  "sasstatus" 5


echo "推送以太网接口状态"
putstatuszbx "/net/port/eth show" "eth.list"  "status" 10

echo "推送FC接口信息"
putstatuszbx "/net/port/fc show" "fc.list"  "fcstatus" 6

echo "推送电池状态"
sp_putstatuszbx "/env/bat show" "sp.list"  "spstatus" 4

echo "推送电源状态"
ps_putstatuszbx "/env/ps show" "ps.list"  "psstatus" 5

echo "推送存储处理器状态"
ps_putstatuszbx "/env/sp show" "cc.list"  "ccstatus" 6

echo "推送硬盘状态"
ps_putstatuszbx "/env/disk show" "disk.list"  "diskstatus" 10

echo "推送存储池容量"
pool_putstatuszbx "/stor/config/pool show -detail" "pool.list"  "poolused" 36

以推送以太网接口信息为例说吧       

#传输参数:命令、自动发现键值前缀、监控项键值前缀、单个指标信息相关行数(偏移量方便分割)、
putstatuszbx(){
        cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd" 
        alllist=`$cmdstar $1`
        #输出以太网网卡ID列表
        IDlist=`echo "$alllist"|grep "^[0-9]:.*ID"|awk -F "= " '{print$2}'`
        Namelist=`echo "$alllist"|grep "Name"|awk -F "= " '{print$2}'|tr ' ' '-'`

        #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json原始格式输出
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix
        zbx_sender "$2" $bb         #推送自动发现json数据
        #echo "$aa"  
        #echo "$bb"

	    
        #将每个以太网卡状态推送到zabbix
        for i in $IDlist
        do
                eth=`echo "$alllist"|grep  $i  -A $4`
                ethname=`echo "$eth"|grep "Name"|awk -F"= " '{print $2}'|tr ' ' '-'`
                ethstatus=`echo "$eth"|grep "Health state"|awk -F"= " '{print $2}'`
#                echo "状态输出 $ethname $ethstatus"
                ww=`echo "$3.[$ethname]"`
                qq=`echo $ethstatus|tr ' ' '_'`
#                echo "监控项原形输出:$ww $qq"
                zbx_sender  $ww $qq
                #zbx_sender  $ww "no"
                echo "---------"
        done
}

putstatuszbx "/net/port/eth show" "eth.list"  "status" 10 可以看到是调用putstatuszbx这个函数,第一个参数是查询以太网状态的命令,第二个参数是创建自动发现规则时要的键值key,第三个参数是监控项原型的key前缀(为了避免主机监控项key冲突),第四个参数是用于分割文本用的,比如只要从某字符串开头的那行以下的10行内容,grep -A 10 直接可以获取。

 重要点:

1、 #SAS接口自动发现推送
        aa=`jsonput $Namelist`      #json格式输出,必须要json格式
        bb=`echo $aa|sed 's/ //g'`  #将json去除换行和空格格式化成一行,方便后面推送至zabbix,有空格和换行推送就会报错
        zbx_sender "$2" $bb         #推送自动发现json数据

    注意:echo $a和echo "$aa"是有区别的,区别在于echo "$aa" 原样输出(包含换行),echo $a不会输出换行

2、eth=`echo "$alllist"|grep  $i  -A $4`  这个就很关键了,虽然命令支持加ID信息查看单独以太网卡的信息,但是我没这样用,为什么?考虑到网络IO延迟问题,我在开始cmdstar="uemcli -d $client_ip -u $client_user -p $client_pwd"  就将所有以太网卡信息获取出来了,我通过分割字符串文本的方式来得到不同卡的信息,就是通过grep -A实现的,这样就只需要一次网络IO就能获取到我要的以太网卡所有信息

zabbix 采集的内存数据是负数 zabbix采集器_zabbix 自动发现

json格式这样的,由于我现在没环境所以你懂的,{#PORT}换成{#ETHNAME}就是上面jsonput函数输出的格式

zabbix 采集的内存数据是负数 zabbix采集器_zabbix 自动发现_02

 

命令获取信息如下:

root@localhost .pip]# uemcli -d ****** -u admin -p **** /net/port/eth  show
Storage system address: ****
Storage system port: 443
HTTPS connection

1:    ID                 = spa_srm
      Name               = SP A Sync Replication Management Port
      SP                 = spa
      Protocols          = srm
      MTU size           = 1500
      Speed              = 1 Gbps
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = F6:60:F0:76:8F:EB

2:    ID                 = spb_mgmt
      Name               = SP B Management Port
      SP                 = spb
      Protocols          = mgmt
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 00:00:00:00:00:00

3:    ID                 = spa_mgmt
      Name               = SP A Management Port
      SP                 = spa
      Protocols          = mgmt
      MTU size           = 1500
      Speed              = 1 Gbps
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 08:00:1B:FF:49:0F

4:    ID                 = spb_srm
      Name               = SP B Sync Replication Management Port
      SP                 = spb
      Protocols          = srm
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 0A:83:23:80:0F:62

5:    ID                 = spb_eth2
      Name               = SP B Ethernet Port 2
      SP                 = spb
      Protocols          = file, net, iscsi
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 00:60:16:AF:4C:95

6:    ID                 = spb_eth3
      Name               = SP B Ethernet Port 3
      SP                 = spb
      Protocols          = file, net, iscsi
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 00:60:16:AF:4C:94

7:    ID                 = spa_eth3
      Name               = SP A Ethernet Port 3
      SP                 = spa
      Protocols          = file, net, iscsi
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 00:60:16:A5:80:28

8:    ID                 = spa_eth2
      Name               = SP A Ethernet Port 2
      SP                 = spa
      Protocols          = file, net, iscsi
      MTU size           = 1500
      Speed              = 
      Health state       = OK (5)
      Aggregated port ID = None
      FSN port ID        = None
      MAC address        = 00:60:16:A5:80:29

再就是zabbix模板编写了,给你们看截图