zabbix模板的自動發現規則(ldd)實現被監控項自動發現
自動發現規則(ldd)用途說明
在zabbix自帶的linux模板的自動發現規則中,有一個Mounted filesystem discovery
自動發現規則,可以根據每個服務器磁盤梳理不同,自動生成相應的磁盤監控數據.
這就是自動注冊的用途,根據不同服務器上同一個監控項不同的數量,自動生成對應數量的監控
例如5個服務器都分別啟動了tomcat多實例,但啟動的tomcat數量不相同,端口也不同,我想要監控這些端口是否down掉:
用普通的方式創建的監控模板,就得給每個服務器單獨創建,不能通用
而如果通過自動發現規則來創建,就可以只用一個模板,對應這些不同數量的tomcat進行端口檢查
自動發現規則使用實例
以監控java端口的自動發現為例,進行操作說明
流程:
- 命令行獲取結果
- 編寫zabbix腳本,輸出json格式
- 創建zabbix客戶端key
- 服務端驗證結果
- web頁添加模板規則
- web頁主機綁定模板
- 驗證結果
1. 命令行獲取結果
首先在命令行,使用命令獲取想要的結果
[root@zhimai-api02 api]# ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'
9090
9091
2. 編寫zabbix腳本,輸出json格式
zabbix的api需要的都是json格式的數據,這里也不例外,不管通過shell腳本還是python腳本,反正最終需要輸出json格式數據
shell腳本如下:
vim java_port_list.sh
#!/bin/bash
#獲取所有java服務端口,並以json格式返回
string=`ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'`
count=`echo $string|wc -w`
printf '{"data":[\n'
for ((i=1;i<=$count;i++))
do
proc_array=`echo $string |cut -d ' ' -f$i`
#echo "proc"$proc_array
printf "\t{\"{#PORT}\":\"${proc_array}\"},\n"
done
date=`date +%d%H%m%s`
printf "\t{\"{#DATE}\":\"${date}\"}\n"
printf "\t]\n"
printf "}\n"
腳本執行結果如下:
[root@zhimai-api02 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh
{"data":[
{"{#PORT}":"9090"},
{"{#PORT}":"9091"},
{"{#DATE}":"3117101572512518"}
]
}
# 最前面的data是標准語法要求的,必須要相同,后面的key可以自己定義
3. 創建zabbix客戶端key
在zabbix_agentd.d
目錄下,創建兩個自定義key,一個key用來自動發現,一個key用來作為具體監控項
[root@zhimai-api02 ~]# cat /etc/zabbix/zabbix_agentd.d/java_api.conf
# 獲取json列表傳遞給zabbix-server
UserParameter=discovery.api.port,sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh
# 端口狀態監控key
UserParameter=api.port.status[*],ss -lntup|grep "$1"|wc -l
重啟zabbix客戶端,然后到服務端去測試驗證
systemctl restart zabbix-agent.service
4. 服務端驗證結果
在zabbix服務使用zabbix-get命令驗證
[root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port
{"data":[
{"{#DATE}":"3114101572502867"}
]
}
如上,沒有獲取到java端口信息,經查是ss -lntup
命令中的-p
參數,在普通用戶下是看不了其他用戶進程的,也就獲取不到數據,可以使用免密sudo方式,也可以給ss
命令添加s
權限,讓ss命令直接在root命令下運行
#客戶端上操作
chmod +s /usr/sbin/ss
再次在服務端驗證:
[root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port
{"data":[
{"{#PORT}":"9090"},
{"{#PORT}":"9091"},
{"{#DATE}":"3117101572512494"}
]
}
再拿獲取的端口9090
驗證端口存活狀態key
[root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k api.port.status[9090]
1
如上,已經能獲取端口列表,也能驗證改端口的狀態了,可以添加規則了
5. web頁添加模板規則
A 先創建模板的自動發現規則
在web頁面創建模板,進入模板的自動發現規則
頁,創建自動發現規則,主要注意鍵值
和過濾器
兩項設置
B 繼續編寫自動發現規則的監控項原型和觸發器類型
6.web頁主機綁定模板
此操作過於簡單,略
7. 驗證結果
過程中遇到的問題:
- json格式錯誤導致自動發現不了
問題:自動發現不了,zabbix-server端日志提示became not supported
discovery rule "xxx:discovery.api.port" became not supported: Value should be a JSON object
原因:這個問題經過檢查,是輸出的內容不是json格式導致的
2. 有多個端口/服務,但只能自動發現一個端口/服務
原因:也是由於json格式導致的
正確的應該每個key-value鍵值對都要用一堆大括號包起來
但輸出的json格式中,卻將所有的鍵值對只用了一個大括號包起來,如下
```json
正確
{"data":[
{"{#PORT}":"9090"},
{"{#PORT}":"9091"}
]
}
錯誤
{"data":[{
"{#PORT}":"9090",
"{#PORT}":"9091"
}]
}
```
3. 客戶端執行腳本正常,服務端用zabbix-get獲取數據不正確
是由於使用的命令,如ss
,在普通用戶模式下,是沒有權限獲取如進程信息之類數據導致的
解決辦法:可以使用visudo給zabbix用戶授權某些命令免密碼執行,也可以給這些命令增加s
權限,如
chmod +s /usr/sbin/ss
#增加操作一定要慎重,個別可以修改數據的命令,一定不要添加s權限