一:實驗對象
操作系統版本:Red Hat Enterprise Linux Server release 6.6 (Santiago)
監控對象:通過服務器傳感器獲取到的所有在使用的硬件信息
zabbix版本:4.0.4
二:zabbix介紹
zabbix適合中小型企業、大型企業的用戶使用。單個Server節點可以支持上萬台設備,每秒可以處理1.5萬次請求,理論上可以支持5萬台設備。
三:為什么要選擇zabbix
1、 首先zabbix的幾乎支持我們工作中的所有環境。
2、 其中zabbix的Server和Agent都采用C語言編碼,對系統資源占用非常小,數據采集的性能和速度非常快。
3、 可以將數據永久存儲在數據庫,也可以設置存儲時長,便於對監控數據的二次分析。
4、 非常豐富的擴展能力,自定義監控項和實現數據采集,幾乎監控所有的數據。
四:zabbix架構
1、 zabbix的通用架構是C/S架構
2、 還有一種分布式架構Client/Proxy/Server或者叫Client/Node/Server(我們后期主要以分布式架構去實現)
五:zabbix運行流程
六:zabbix的常見組件
下面是我們會用到的:
zabbix-server:zabbix的核心程序(老師)
zabbix-agent:zabbix的代理程序(學生)
zabbix-proxy:zabbix的分布式部署程序(班長)
常見的監控流程是:
1、 老師直接找學生要作業,學生交作業(直接監控)
2、 老師找班長要作業,班長去找學生收作業后給老師(分布式監控)
七:zabbix安裝
yum安裝非常簡單請參見官方文檔:https://www.zabbix.com/download
八:IPMI獲取服務器狀態值
[root@zabbixServer ~]# ipmitool -I open sensor list
獲取的信息:
UID Light | 0x0 | discrete | 0x0080| na | na | na | na | na | na
Sys. Health LED | 0x0 | discrete | 0x0080| na | na | na | na | na | na
Power Supply 1 | 85 | Watts | ok | na | na | na | na | na | na
Power Supply 2 | 20 | Watts | ok | na | na | na | na | na | na
Power Supplies | 0x0 | discrete | 0x0180| na | na | na | na | na | na
Fan 1 | 6.272 | percent | ok | na | na | na | na | na | na
Fan 2 | 6.272 | percent | ok | na | na | na | na | na | na
Fan 3 | 6.272 | percent | ok | na | na | na | na | na | na
Fan 4 | 34.496 | percent | ok | na | na | na | na | na | na
Fan 5 | 43.120 | percent | ok | na | na | na | na | na | na
Fan 6 | 43.120 | percent | ok | na | na | na | na | na | na
Fans | 0x0 | discrete | 0x0180| na | na | na | na | na | na
01-Inlet Ambient | 21.000 | degrees C | ok | na | na | na | na | 42.000 | 46.000
02-CPU 1 | 40.000 | degrees C | ok | na | na | na | na | 70.000 | 0.000
03-CPU 2 | 40.000 | degrees C | ok | na | na | na | na | 70.000 | 0.000
04-P1 DIMM 1-3 | 25.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
05-P1 DIMM 4-6 | 26.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
06-P1 DIMM 7-9 | 24.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
07-P1 DIMM 10-12 | 24.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
08-P2 DIMM 1-3 | 29.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
09-P2 DIMM 4-6 | 30.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
10-P2 DIMM 7-9 | 26.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
11-P2 DIMM 10-12 | 25.000 | degrees C | ok | na | na | na | na | 87.000 | 0.000
12-HD Max | 35.000 | degrees C | ok | na | na | na | na | 60.000 | 0.000
13-Chipset | 44.000 | degrees C | ok | na | na | na | na | 105.000 | 0.000
14-P/S 1 | 28.000 | degrees C | ok | na | na | na | na | 0.000 | 0.000
15-P/S 2 | 28.000 | degrees C | ok | na | na | na | na | 0.000 | 0.000
16-P/S 2 Zone | 29.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
17-VR P1 | 35.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
18-VR P2 | 38.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
19-VR P1 Mem | 35.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
20-VR P1 Mem | 32.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
21-VR P2 Mem | 33.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
22-VR P2 Mem | 35.000 | degrees C | ok | na | na | na | na | 115.000 | 120.000
23-VR P1Vtt Zone | 28.000 | degrees C | ok | na | na | na | na | 90.000 | 95.000
24-VR P2Vtt Zone | 30.000 | degrees C | ok | na | na | na | na | 90.000 | 95.000
25-HD Controller | 56.000 | degrees C | ok | na | na | na | na | 100.000 | 0.000
26-iLO Zone | 31.000 | degrees C | ok | na | na | na | na | 90.000 | 95.000
27-LOM Card | na | | na | na | na | na | na | 100.000 | 0.000
28-PCI 1 | na | | na | na | na | na | na | 100.000 | 0.000
29-PCI 2 | na | | na | na | na | na | na | 100.000 | 0.000
30-PCI 3 | na | | na | na | na | na | na | 100.000 | 0.000
31-PCI 4 | na | | na | na | na | na | na | 100.000 | 0.000
32-PCI 5 | na | | na | na | na | na | na | 100.000 | 0.000
33-PCI 6 | na | | na | na | na | na | na | 100.000 | 0.000
34-PCI 1 Zone | 26.000 | degrees C | ok | na | na | na | na | 65.000 | 70.000
35-PCI 2 Zone | 27.000 | degrees C | ok | na | na | na | na | 66.000 | 71.000
36-PCI 3 Zone | 27.000 | degrees C | ok | na | na | na | na | 66.000 | 71.000
37-PCI 4 Zone | na | | na | na | na | na | na | 65.000 | 70.000
38-PCI 5 Zone | na | | na | na | na | na | na | 65.000 | 70.000
39-PCI 6 Zone | na | | na | na | na | na | na | 65.000 | 70.000
40-I/O Board 1 | 29.000 | degrees C | ok | na | na | na | na | 66.000 | 71.000
41-I/O Board 2 | na | | na | na | na | na | na | 66.000 | 71.000
42-VR P1 Zone | 26.000 | degrees C | ok | na | na | na | na | 95.000 | 100.000
43-BIOS Zone | 36.000 | degrees C | ok | na | na | na | na | 90.000 | 95.000
44-System Board | 29.000 | degrees C | ok | na | na | na | na | 80.000 | 85.000
45-SuperCap Max | 21.000 | degrees C | ok | na | na | na | na | 65.000 | 0.000
46-Chipset Zone | 33.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
47-Battery Zone | 30.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
48-I/O Zone | 30.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
49-Sys Exhaust | 29.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
50-Sys Exhaust | 31.000 | degrees C | ok | na | na | na | na | 75.000 | 80.000
Memory | 0x0 | discrete | 0x4080| na | na | na | na | na | na
Power Meter | 92 | Watts | ok | na | na | na | na | na | na
Clr 1 Bay 1 | 0x1 | discrete | 0x0180| na | na | na | na | na | na
Clr 1 Bay 2 | 0x1 | discrete | 0x0180| na | na | na | na | na | na
IPMI獲取的值由於參考資料有限,並不能全部理解其中的意思,所以這在開始做監控的時候帶來了很大的困擾,最后考慮用SNMP協議取值,SNMP有個MIB庫記錄了服務器狀態值和OID的對應關系,但是最后發現,現在的服務器廠商並不是把所有的OID都公開出去了,這就導致用SNMP監控也遇到了一個困難,我們也不可能找廠商要這些OID的值,既然HP服務器ILO口需要授權,那能給你OID嗎?所以SNMP監控我排除了,還是把思路轉向了IPMI,最后查資料發現第二列是各硬件的溫度(也有電壓值)信息,要是溫度或者電壓為0就說明硬件已經不工作了(測試發現的),但是里面還有一些沒有數值的信息,如:0x0,0x1,na等這些是什么意思呢?
na:傳感器返回的值要是na這個硬件就是沒使用被關閉的狀態;可以用命令去查看:
[root@zabbixServer ~]# ipmitool -v sensor list # 獲取到的值為na
Sensor ID : 28-PCI 1 (0x28)
Entity ID : 11.2
Sensor Type (Threshold) : Temperature
Sensor Reading : Unable to read sensor: Device Not Present
查看這個Entity ID的信息:
[root@zabbixServer ~]# ipmitool sdr entity 11.2 # 發現狀態是disabled
28-PCI 1 | 28h | ns | 11.2 | Disabled
0x0、0x1:這些值並不是說硬件未使用,而是記錄一個總的過程,但是具體代碼代表什么,目前還沒查到,所以這個信息可以排除掉,只要有硬件在使用過程中發生故障不使用那狀態絕對是0,所以我們只要監0的值就可以了。
1 #!/usr/bin/python3 2 # 3 4 import os 5 6 hardware_status = os.popen('cat /tmp/zabbix_*.info | awk -F "|" \'{print $2}\' | grep -vE "[a-z|A-Z]"') 7 result_status = hardware_status.readlines() 8 9 for i in result_status: 10 if i.strip() == "0": 11 print(1) 12 break 13 else: 14 print(0) 15 break
九:引入zabbix監控
1、 創建鍵值對
[root@zabbixServer ~]# vim /etc/zabbix/zabbix_agentd.conf #切換到296行
UserParameter=HP_hardware,/etc/zabbix/scripts/test.py
前面的HP_ hardware是鍵
后面的/etc/zabbix/scripts/test.py是值
我們創建好了之后測試一下是否能通過zabbix-agent獲取到值
[root@zabbixServer ~]# zabbix_get -s 192.168.2.1 -k "HP_hardware"
0
發現能獲取到值,要是獲取不到值說明腳本是有問題的。
2、 創建主機組
3、 創建模板
4、 創建應用集
5、 創建items
6、 創建觸發器
7、 創建趨勢圖
8、 創建報警動作
用腳本報警需要查看zabbix-server.conf里面435行內容:
[root@linux-node1 ~]# vim /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
這里說明了zabbix腳本的配置路徑,我們把腳本放在這里面即可:
添加報警媒介:
配置報警動作:
恢復通知:
附告警通知內容:
告警標題:故障({TRIGGER.STATUS}),服務器:({HOSTNAME1}發生:{TRIGGER.NAME})故障!
告警信息:
告警事件ID: {EVENT.ID}
告警主機IP: {HOST.IP}
告警主機: {HOSTNAME1}
告警時間: {EVENT.DATE}-{EVENT.TIME}
告警等級: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警項目: {TRIGGER.KEY1}
問題詳情: {ITEM.NAME}:{ITEM.VALUE}
當前狀態: {TRIGGER.STATUS}:{ITEM.VALUE1}
恢復標題:恢復({TRIGGER.STATUS}),服務器:({HOSTNAME1}:{TRIGGER.NAME})已恢復!
恢復信息:
告警事件ID: {EVENT.ID}
告警主機IP: {HOST.IP}
告警主機: {HOSTNAME1}
告警時間: {EVENT.DATE}-{EVENT.TIME}
告警等級: {TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警項目: {TRIGGER.KEY1}
問題詳情: {ITEM.NAME}:{ITEM.VALUE}
當前狀態: {TRIGGER.STATUS}
十:達到條件觸發微信報警
恢復后提醒:
十一:zabbix部署架構圖
十二:附企業微信報警腳本
企業號添加第三方應用參見技術大佬的技術博文:
https://blog.csdn.net/qq_31613055/article/details/78831607
1 #!/usr/bin/python3 2 # 3 # -*- coding:utf-8 -*- 4 5 import requests 6 import sys 7 import json 8 9 corpid=企業ID 10 appsecret=企業號的信息 11 agentid=應用組ID 12 13 #獲取accesstoken 14 token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret 15 req=requests.get(token_url) 16 accesstoken=req.json()['access_token'] 17 18 #發送消息 19 msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken 20 21 touser=sys.argv[1] 22 subject=sys.argv[2] 23 toparty=22 24 message=sys.argv[3] 25 26 params={ 27 "touser": touser, 28 "toparty": toparty, 29 "msgtype": "text", 30 "agentid": agentid, 31 "text": { 32 "content": message 33 }, 34 "safe":0 35 } 36 37 req=requests.post(msgsend_url,data=json.dumps(params,ensure_ascii=False).encode('utf-8'))