zabbix模板的自動發現規則(ldd)實現被監控項自動發現


zabbix模板的自動發現規則(ldd)實現被監控項自動發現

自動發現規則(ldd)用途說明

在zabbix自帶的linux模板的自動發現規則中,有一個Mounted filesystem discovery自動發現規則,可以根據每個服務器磁盤梳理不同,自動生成相應的磁盤監控數據.
這就是自動注冊的用途,根據不同服務器上同一個監控項不同的數量,自動生成對應數量的監控

例如5個服務器都分別啟動了tomcat多實例,但啟動的tomcat數量不相同,端口也不同,我想要監控這些端口是否down掉:
用普通的方式創建的監控模板,就得給每個服務器單獨創建,不能通用
而如果通過自動發現規則來創建,就可以只用一個模板,對應這些不同數量的tomcat進行端口檢查

自動發現規則使用實例

以監控java端口的自動發現為例,進行操作說明
流程:

  1. 命令行獲取結果
  2. 編寫zabbix腳本,輸出json格式
  3. 創建zabbix客戶端key
  4. 服務端驗證結果
  5. web頁添加模板規則
  6. web頁主機綁定模板
  7. 驗證結果

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. 驗證結果

自動發現結果

過程中遇到的問題:

  1. 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權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM