因爲工做關係好久沒有更新博客了,本文基於生產配置,是zabbix系列的另外一補充;本次要講的是zabbix Low-level discovery簡稱(LLD),咱們在配置items(監控項)時,有時須要對相似的Items進行添加,換句話說,多臺機器上的某一監控具備相似的items,如系統開放的服務,再如磁盤分區,網卡名稱等,後兩種zabbix已經自帶,今天咱們以自定義監控每一個系統開放的服務來講明 LLD的使用邏輯;
和普通items獲取不一樣的是,LLD 腳本在獲取返回時,格式必須是json形式;
和自動發現不一樣的是,自動發現經過網絡發現設備;而LLD是針對主機或模板中用來自動發現定義的items和添加觸發器和圖形的;
本次測試操做基於zabbix3.4.4 本文中的相關腳本和模板下載php
一、獲取開放的服務
任何獲取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下 ,這樣就不會漏掉,再說大部分系統或知名程序都遵照這一規定,你爲何不能遵照呢?
在一臺監控機器上執行以下:
記住這裏的{#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 三種狀況知足一種便可;
運行效果以下:
對iptables服務檢查 返回 1說明 iptables正常
關閉iptables 再次進行檢查:
而對httpd服務進行檢查,因爲本機根本沒有httpd服務,因此返回的是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") 如圖:
ide
二、建立自動發現規則(LLD)
如上圖點自動發現規則在模板中建立 自動發現規則 -- 建立自動發現規則 如圖:
這裏須要注意的是 鍵值: servies.scan 即item 是在2.3小節的配置文件中定義的,不可亂寫工具
再配置上圖中的過濾器 配置變量(宏)如圖:
測試
此處的{#PRO_NAME}就是上面2.1節中腳本返回的變量; -- 保存3d
三、建立 配置 監控項原型
如圖:
填寫名稱,等相關信息如圖:
此處須要注意的$1 和鍵值 是 2.3 定義items中的$1 也便是服務名; 保存;
四、建立觸發器類型
如圖:
說明:觸發器名稱:便是 「服務名」 is down
表達式的意思就是 當發現某服務返回的值不是 1時發出警告
保存 這個 模板中的自動發現規則 就完成啦
可是這裏存在一個問題,當咱們機器上yum工具時,會在/var/run下生成yum.pid這樣就會偵測到一個新服務,yum,但yum執行完後yum.pid會被刪除,此時觸發器就會報yum is down,爲了解決這類問題,咱們能夠修改觸發器報警策略,修改爲以下:
意思就是,最後狀態不是1 同時一小時前的狀態是1;這樣那此在/var/run生成臨時pid的程序就不會被觸發;
接下來就是在主機上應用模板,能夠批量添加;這裏就忽略了;
五、測試
看下效果圖:
能夠看到此主機應用了模板後已經能夠拿到監控項數據了,咱們來關閉這臺主機的防火牆服務試試,看看觸發器是否正常;
如圖:
再把iptables服務啓動
能夠看到服務關閉和啓動能夠報警與恢復;至此自動發現服務已經能夠正常使用啦!經過這個實例,但願你們能理解自動發現規則的原理邏輯!本文基於生產故有些截圖帶有塗;主要用於備忘與分享,若有錯誤之處歡迎留言!