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)監控系統服務

能夠看到服務關閉和啓動能夠報警與恢復;至此自動發現服務已經能夠正常使用啦!經過這個實例,但願你們能理解自動發現規則的原理邏輯!本文基於生產故有些截圖帶有塗;主要用於備忘與分享,若有錯誤之處歡迎留言!

相關文章
相關標籤/搜索