zabbix自定义自动发现服务(low-level-discovery)监控系统服务

1、概述

因为工做关系好久没有更新博客了,本文基于生产配置,是zabbix系列的另外一补充;本次要讲的是zabbix Low-level discovery简称(LLD),咱们在配置items(监控项)时,有时须要对相似的Items进行添加,换句话说,多台机器上的某一监控具备相似的items,如系统开放的服务,再如磁盘分区,网卡名称等,后两种zabbix已经自带,今天咱们以自定义监控每一个系统开放的服务来讲明 LLD的使用逻辑;
和普通items获取不一样的是,LLD 脚本在获取返回时,格式必须是json形式;
和自动发现不一样的是,自动发现经过网络发现设备;而LLD是针对主机或模板中用来自动发现定义的items和添加触发器和图形的;
本次测试操做基于zabbix3.4.4 本文中的相关脚本和模板下载php

2、LLD脚本

一、获取开放的服务
任何获取items都要基于程序脚本,LLD发现也不例外,如下是获取系统开放服务脚本discovery_services.shweb

# cat /usr/local/zabbix-3.4.4/scripts/discovery_services.sh

#!/bin/bash
proarray=($(find /var/run/ -name "*.pid"  2> /dev/null||egrep -v '(rpc|php_daemon|haldaemon|irqbalance|console-kit-daemon)' |awk -F'/' '{print $NF}'|awk -F'.' '{print $1}'))    # 排除不监控的服务

length=${#proarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
printf "\t"
printf '\n\t\t{'
printf "\"{#PRO_NAME}\":\"iptables\"}"       #必需要添加的iptables
printf  ","
for ((i=0;i<$length;i++))
do
        printf '\n\t\t{'
        printf "\"{#PRO_NAME}\":\"${proarray[$i]}\"}"
        if [ $i -lt $[$length-1] ];then
                printf ','
        fi
done
printf  "\n\t]\n"
printf "}\n"

说明:以上脚本基于 /var/run下的pid进行监控开放的服务,因此若是是公司运维人员自已经开发的管理脚本服务,pid文件请按默认的放到/var/run下 ,这样就不会漏掉,再说大部分系统或知名程序都遵照这一规定,你为何不能遵照呢?
在一台监控机器上执行以下:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
记住这里的{#PRO_NAME} 这个就是自动发现规则中的宏变量;另外这个脚本返回的是json格式;json

二、检查系统状态
对获取的服务进行检查bash

# cat /usr/local/zabbix-3.4.4/scripts/program_status.sh

#!/bin/bash
procjetName="${1:-NULL}"
LOCK_PATH="/var/lock/subsys"     
RUN_PATH="/var/run"
ret_ok=1
ret_critical=3
ret_unknown=4

if  [[ ${procjetName} == "NULL" ]] ; then
        echo ${ret_unknown}
fi

if [ -f "${LOCK_PATH}/${procjetName}" ] || [ -f "${RUN_PATH}/${procjetName}.pid" ]  || [ -f "${RUN_PATH}/${procjetName}/${procjetName}.pid" ] ; then
        echo ${ret_ok}
else
        echo ${ret_critical}
fi

以上脚本检查若是服务存在则返回1 不然返回 3 ,若是服务不存在则返回4
检查的原则就是在/var/run/下是否有和服务同名的pid文件存在,或/var/run/服务/服务.pid存在,对于像iptabls这种则检查 /var/run/subsys/服务.pid 三种状况知足一种便可;
运行效果以下:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
对iptables服务检查 返回 1说明 iptables正常
关闭iptables 再次进行检查:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
而对httpd服务进行检查,因为本机根本没有httpd服务,因此返回的是3
zabbix自定义自动发现服务(low-level-discovery)监控系统服务网络

三、定义items运维

# cat /usr/local/zabbix-3.4.4/etc/zabbix_agentd.conf.d/LLD_Services.conf
UserParameter=services.scan,/bin/bash /usr/local/zabbix-3.4.4/scripts/discovery_services.sh
UserParameter=services.status[*],/bin/bash /usr/local/zabbix-3.4.4/scripts/program_status.sh $1

3、添加模板和自动发现规则

这里须要在web页上添加,和添加items很相似;
一、建立模板
进入web端;单击 配置--模板--配置模板--建立模板-- 这里模板名叫 “Ickey Services status” --建立应用集("Services_status") 如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
zabbix自定义自动发现服务(low-level-discovery)监控系统服务ide

二、建立自动发现规则(LLD)
如上图点自动发现规则在模板中建立 自动发现规则 -- 建立自动发现规则 如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
这里须要注意的是 键值: servies.scan 即item 是在2.3小节的配置文件中定义的,不可乱写工具

再配置上图中的过滤器 配置变量(宏)如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务测试

此处的{#PRO_NAME}就是上面2.1节中脚本返回的变量; -- 保存3d

三、建立 配置 监控项原型
如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务

填写名称,等相关信息如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
此处须要注意的$1 和键值 是 2.3 定义items中的$1 也便是服务名; 保存;

四、建立触发器类型
如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务

zabbix自定义自动发现服务(low-level-discovery)监控系统服务
说明:触发器名称:便是 “服务名” is down
表达式的意思就是 当发现某服务返回的值不是 1时发出警告
保存 这个 模板中的自动发现规则 就完成啦
可是这里存在一个问题,当咱们机器上yum工具时,会在/var/run下生成yum.pid这样就会侦测到一个新服务,yum,但yum执行完后yum.pid会被删除,此时触发器就会报yum is down,为了解决这类问题,咱们能够修改触发器报警策略,修改为以下:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
意思就是,最后状态不是1 同时一小时前的状态是1;这样那此在/var/run生成临时pid的程序就不会被触发;

接下来就是在主机上应用模板,能够批量添加;这里就忽略了;
五、测试
看下效果图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
能够看到此主机应用了模板后已经能够拿到监控项数据了,咱们来关闭这台主机的防火墙服务试试,看看触发器是否正常;
如图:
zabbix自定义自动发现服务(low-level-discovery)监控系统服务
再把iptables服务启动
zabbix自定义自动发现服务(low-level-discovery)监控系统服务

能够看到服务关闭和启动能够报警与恢复;至此自动发现服务已经能够正常使用啦!经过这个实例,但愿你们能理解自动发现规则的原理逻辑!本文基于生产故有些截图带有涂;主要用于备忘与分享,若有错误之处欢迎留言!

相关文章
相关标签/搜索