1. 程式人生 > >zabbix自定義自動發現服務(low-level-discovery)監控系統服務

zabbix自定義自動發現服務(low-level-discovery)監控系統服務

51cto 觸發 機器 相關信息 agentd 格式 int lse 監控

一、概述

由於工作關系很久沒有更新博客了,本文基於生產配置,是zabbix系列的另一補充;本次要講的是zabbix Low-level discovery簡稱(LLD),我們在配置items(監控項)時,有時需要對類似的Items進行添加,換句話說,多臺機器上的某一監控具有類似的items,如系統開放的服務,再如磁盤分區,網卡名稱等,後兩種zabbix已經自帶,今天我們以自定義監控每個系統開放的服務來說明 LLD的使用邏輯;
和普通items獲取不同的是,LLD 腳本在獲取返回時,格式必須是json形式;
和自動發現不同的是,自動發現通過網絡發現設備;而LLD是針對主機或模板中用來自動發現定義的items和添加觸發器和圖形的;

本次測試操作基於zabbix3.4.4 本文中的相關腳本和模板下載

二、LLD腳本

1、獲取開放的服務
任何獲取items都要基於程序腳本,LLD發現也不例外,以下是獲取系統開放服務腳本discovery_services.sh

# 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下 ,這樣就不會漏掉,再說大部分系統或知名程序都遵守這一規定,你為什麽不能遵守呢?
在一臺監控機器上執行如下:
技術分享圖片
記住這裏的{#PRO_NAME} 這個就是自動發現規則中的宏變量;另外這個腳本返回的是json格式;

2、檢查系統狀態
對獲取的服務進行檢查

# 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 三種情況滿足一種即可;
運行效果如下:
技術分享圖片
對iptables服務檢查 返回 1說明 iptables正常
關閉iptables 再次進行檢查:
技術分享圖片
而對httpd服務進行檢查,由於本機根本沒有httpd服務,所以返回的是3
技術分享圖片

3、定義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

三、添加模板和自動發現規則

這裏需要在web頁上添加,和添加items很類似;
進入web端;單擊 配置--模板--配置模板--創建模板-- 這裏模板名叫 “Ickey Services status” --創建應用集("Services_status") 如圖:
技術分享圖片
技術分享圖片

如上圖點自動發現規則在模板中創建 自動發現規則 -- 創建自動發現規則 如圖:
技術分享圖片
這裏需要註意的是 鍵值: servies.scan 即item 是在2.3小節的配置文件中定義的,不可亂寫

再配置上圖中的過濾器 配置變量(宏)如圖:
技術分享圖片

此處的{#PRO_NAME}就是上面2.1節中腳本返回的變量; -- 保存
創建 配置 監控項原型 如圖:
技術分享圖片

填寫名稱,等相關信息如圖:
技術分享圖片
此處需要註意的$1 和鍵值 是 2.3 定義items中的$1 也即是服務名; 保存;

創建觸發器類型
如圖:
技術分享圖片

技術分享圖片
說明:觸發器名稱:即是 “服務名” is down
表達式的意思就是 當發現某服務返回的值不是 1時發出警告
保存 這個 模板中的自動發現規則 就完成啦

接下來就是在主機上應用模板,可以批量添加;這裏就忽略了;
看下效果圖:
技術分享圖片
技術分享圖片
可以看到此主機應用了模板後已經可以拿到監控項數據了,我們來關閉這臺主機的防火墻服務試試,看看觸發器是否正常;
如圖:
技術分享圖片
再把iptables服務啟動
技術分享圖片

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

zabbix自定義自動發現服務(low-level-discovery)監控系統服務