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