Zabbix 使用教程:新增主機、套用範本與配置告警
Zabbix 的日常使用是一個固定迴圈:被監控端裝 agent 或開啟 SNMP,在 Data collection → Hosts 新增主機並套用範本,用宏把閾值改成自己的標準,再用媒介、使用者和動作把告警送到人,平時在 Problems、Latest data 和儀表盤裡看問題與圖形。下面按這個順序走一遍,介面以 7.0 為準。
Zabbix 使用教程可以濃縮成五步:讓裝置能被採集(裝 agent、開 SNMP 或 IPMI)→ 新增主機並套用範本 → 用宏調整閾值 → 按需要補充觸發器 → 配置媒介、使用者和動作把告警發出去,之後的日常工作就是看問題、看圖形,割接時設維護期。本文的選單路徑以 Zabbix 7.0 為準,6.0 及更早版本的主機、範本等配置在 Configuration 選單下,位置不同但概念一樣;中文介面的選單結構與英文一致。先認識 7.0 裡最常用的幾個選單:
| 選單 | 用來做什麼 |
|---|---|
| Dashboards | 儀表盤,放問題列表、圖形、Top 排行等元件 |
| Monitoring → Problems | 當前未解決的問題,在這裡確認和處理告警 |
| Monitoring → Hosts / Latest data | 按主機看狀態、最新採集值和圖形 |
| Data collection → Hosts / Templates | 新增主機、套用和編輯範本 |
| Data collection → Maintenance | 設定維護期,割接時遮蔽通知 |
| Alerts → Actions / Media types | 配置告警動作和通知方式 |
| Users → Users / User groups | 使用者、通知位址和主機群組許可權 |
| Administration → Macros / Housekeeping | 全域性宏、資料保留期 |
第一步:讓被監控端能被採集
Linux 伺服器裝 agent 2。 先新增與 server 同版本的官方倉庫,再安裝 agent 2(下面以 7.0 為例,server 是其他版本時把位址裡的 7.0 換掉):
# Ubuntu 24.04
wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo dpkg -i zabbix-release_latest_7.0+ubuntu24.04_all.deb
sudo apt update && sudo apt install -y zabbix-agent2
# Rocky Linux 9
sudo rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-latest-7.0.el9.noarch.rpm
sudo dnf install -y zabbix-agent2
修改 /etc/zabbix/zabbix_agent2.conf 裡的三項:Server 寫允許來採集的 server(或 proxy)位址,ServerActive 寫主動上報的目標,Hostname 寫這台主機在 Zabbix 裡的名字,必須和後面新增主機時填的 Host name 完全一致。假設 server 是 10.0.0.5,這台主機叫 web01:
sudo sed -i -e 's/^Server=127.0.0.1$/Server=10.0.0.5/' \
-e 's/^ServerActive=127.0.0.1$/ServerActive=10.0.0.5/' \
-e 's/^Hostname=Zabbix server$/Hostname=web01/' /etc/zabbix/zabbix_agent2.conf
sudo systemctl restart zabbix-agent2 && sudo systemctl enable zabbix-agent2
# 只允許 server 存取 10050
# Ubuntu:
sudo ufw allow from 10.0.0.5 to any port 10050 proto tcp
# Rocky Linux 9:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="10050" protocol="tcp" accept'
sudo firewall-cmd --reload
回到 Zabbix server 上驗證,返回 1 和一個百分數就說明通了:
sudo apt install -y zabbix-get # Rocky 用 dnf install zabbix-get
zabbix_get -s 10.0.1.11 -k agent.ping
zabbix_get -s 10.0.1.11 -k 'vfs.fs.size[/,pused]'
交換器、UPS、PDU 開啟 SNMP。 在裝置上啟用 SNMP 並設定唯讀團體名,條件允許優先用 SNMPv3。在 server 上先用命令列確認能讀到裝置名稱(需要安裝 snmp 工具包):
snmpget -v2c -c '你的唯讀團體名' 10.0.0.1 1.3.6.1.2.1.1.5.0
伺服器 BMC 開啟 IPMI over LAN。 給 Zabbix 單獨建一個 User 許可權的 BMC 帳號,唯讀感測器就夠用,然後用 ipmitool 確認能讀到溫度。ipmitool 預設按 Administrator 許可權建立會話,用 User 帳號測試時要加 -L USER:
ipmitool -I lanplus -L USER -H 10.20.0.15 -U zbxmon -P 'BMC密碼' sdr type Temperature
別忘了 server 的 StartIPMIPollers 預設是 0,不改成大於 0,IPMI 介面永遠採不到資料。
第二步:新增主機並套用範本
- 開啟 Data collection → Hosts,點右上角 Create host。
- Host name 填主機名,和 agent 配置裡的 Hostname 一致;Visible name 可以填帶中文的顯示名,例如“上海一號機房 B03-web01”。
- Templates 輸入範本名選擇,見下表。
- Host groups 至少選一個,例如按機房和用途建“IDC/SH01”“Linux servers”。許可權是按主機群組分配的,這一步決定了誰能看到這台主機。
- Interfaces 點 Add,按採集方式新增 Agent(連接埠 10050)、SNMP(連接埠 161,選版本,v2c 的團體名預設引用宏
{$SNMP_COMMUNITY})或 IPMI(連接埠 623)介面。IPMI 還要在 IPMI 標籤頁填寫認證演算法、許可權級別、使用者名稱和密碼。 - 多機房時在 Monitored by 裡選擇由哪台 proxy 或哪個 proxy 組採集。
- 點 Add 儲存,一兩分鐘後列表裡 Availability 列的 ZBX、SNMP 或 IPMI 圖示變綠,就說明採整合功。
機房裡常見裝置對應的官方範本:
| 裝置 | 介面 | 範本 |
|---|---|---|
| Linux 伺服器,被動模式 | Agent | Linux by Zabbix agent |
| Linux 伺服器,主動模式或自動註冊 | 不需要介面 | Linux by Zabbix agent active |
| Windows 伺服器 | Agent | Windows by Zabbix agent |
| 華為交換器 | SNMP | Huawei VRP by SNMP |
| H3C 交換器 | SNMP | HP Comware HH3C by SNMP |
| 其他品牌或不確定型號的網路裝置 | SNMP | Network Generic Device by SNMP |
| Dell 伺服器的 iDRAC | SNMP | Dell iDRAC by SNMP |
| 任意品牌伺服器的 BMC | IPMI | Chassis by IPMI |
| APC UPS | SNMP | APC UPS by SNMP |
| 只關心通不通 | 任意介面 | ICMP Ping(server 上要裝 fping) |
幾百台 Linux 主機不要一台台加,用自動註冊。 讓 agent 用系統主機名註冊,並帶上一段主機後設資料:
# /etc/zabbix/zabbix_agent2.conf
ServerActive=10.0.0.5
# 註釋掉固定的 Hostname,改用系統主機名
# Hostname=Zabbix server
HostnameItem=system.hostname
HostMetadata=linux idc-sh01
然後在 Alerts → Actions → Autoregistration actions 裡新建動作:條件寫 Host metadata contains linux,操作依次是 Add host、Add to host groups(Linux servers)、Link templates(Linux by Zabbix agent active);再加一條條件 Host metadata contains idc-sh01 的動作,把主機放進“IDC/SH01”群組。之後新裝系統時把這個 agent 配置一起下發,主機會自己出現在 Zabbix 裡。
第三步:用宏調整閾值,別直接改範本
官方範本的閾值都寫成宏,常用的預設值如下:
| 宏 | 預設值 | 含義 |
|---|---|---|
{$CPU.UTIL.CRIT} |
90 | CPU 使用率 5 分鐘內持續高於該值告警 |
{$MEMORY.UTIL.MAX} |
90 | 記憶體使用率上限 |
{$VFS.FS.PUSED.MAX.WARN}、{$VFS.FS.PUSED.MAX.CRIT} |
80、90 | 檔案系統使用率的兩級閾值 |
{$IF.UTIL.MAX} |
90 | 連接埠 15 分鐘平均利用率上限,單位 % |
{$IFCONTROL} |
1 | 連接埠 down 是否告警,0 表示不告警 |
{$ICMP_LOSS_WARN} |
20 | ICMP 丟包率告警閾值,單位 % |
{$ICMP_RESPONSE_TIME_WARN} |
0.15 | ICMP 平均回應時間閾值,單位秒 |
要改閾值,在主機的 Macros 標籤頁切到“Inherited and host macros”,找到對應的宏點 Change 改值即可。宏的生效順序是:主機上的宏優先,其次是範本上的宏,最後是 Administration → Macros 裡的全域性宏。
帶上下文的宏可以只對某個物件生效,這在機房裡特別有用:
{$VFS.FS.PUSED.MAX.WARN:"/data"}設為 95:只放寬 /data 分割槽的閾值,其他分割槽仍是 80;{$IFCONTROL:"GigabitEthernet0/0/12"}設為 0:這個連接埠 down 時不告警。欠費停機時會主動關閉客戶伺服器所在的交換器連接埠,這類連接埠不設成 0,每次停機都會產生一條“Link down”。
不要直接改官方範本:以後匯入新版範本時,你的修改會被覆蓋。確實要增刪監控項時,在 Data collection → Templates 裡把範本 Clone 一份,改自己的副本。
第四步:自己寫觸發器
範本沒覆蓋的判斷,在 Data collection → Hosts 裡點主機行的 Triggers,再點 Create trigger。要填的主要是名稱、嚴重級別(Not classified、Information、Warning、Average、High、Disaster)和表示式。7.0 的表示式格式是 函式(/主機名/監控項鍵名,引數) 加比較條件:
| 想判斷什麼 | 表示式 | 說明 |
|---|---|---|
| CPU 連續 5 分鐘高於 85% | min(/web01/system.cpu.util,5m)>85 |
用 min:5 分鐘內每個值都超過才報,過濾瞬間尖峰 |
| /data 分割槽使用率超過 95% | last(/web01/vfs.fs.dependent.size[/data,pused])>95 |
鍵名來自 Linux 範本對檔案系統的自動發現 |
| 主機 10 分鐘沒有資料 | nodata(/web01/agent.ping,10m)=1 |
適合主動模式的主機 |
| 最近 3 次 ping 都不通 | max(/core-sw01/icmpping,#3)=0 |
#3 表示最近 3 個值,不是 3 分鐘 |
| 出口連接埠入方向 5 分鐘持續超過 900 Mbps | min(/core-sw01/net.if.in[ifHCInOctets.25],5m)>900000000 |
25 是連接埠的 SNMP 索引,可以在 Latest data 裡查到對應的鍵名;表示式裡的字尾 M 按 1024×1024 計算,寫 900M 並不等於 900 Mbps,按 bps 寫完整數字更準確 |
| 伺服器剛重啟過 | last(/web01/system.uptime)<10m |
執行時間小於 10 分鐘 |
三個讓告警更乾淨的設定:
- 恢復表示式:在 OK event generation 選 Recovery expression,例如問題表示式
min(/web01/system.cpu.util,5m)>85,恢復表示式max(/web01/system.cpu.util,5m)<70,CPU 在 85% 附近來回波動時不會反覆告警和恢復。 - 依賴關係:在 Dependencies 標籤頁,讓機櫃裡每台伺服器的“不可達”觸發器依賴接入交換器的 ICMP 不可達觸發器。交換器斷了,只收到交換器這一條,而不是整櫃幾十條。
- 標籤:給觸發器加
scope:availability、team:network一類標籤,後面按標籤分派通知。
第五步:把告警發出去
告警送達要三樣東西都配好:媒介型別(怎麼發)、使用者的媒介(發到哪)、動作(什麼情況下發給誰)。
1. 郵件。 在 Alerts → Media types 開啟內建的 Email:填寫 SMTP 伺服器、連接埠(SSL/TLS 一般 465,STARTTLS 一般 587)、發件位址、認證方式;Message templates 標籤頁裡已經帶好 Problem、Problem recovery 等訊息範本,按需要改寫即可;內建媒介預設是停用的,記得啟用,再用列表裡的 Test 發一封測試郵件。
2. 企業微信群機器人。 新建一個型別為 Webhook 的媒介,引數保留 To={ALERT.SENDTO}、Subject={ALERT.SUBJECT}、Message={ALERT.MESSAGE},指令碼如下。新建的媒介沒有訊息範本,要在 Message templates 標籤頁至少新增 Problem 和 Problem recovery 兩種,否則這個媒介發不出通知:
var p = JSON.parse(value);
var req = new HttpRequest();
req.addHeader('Content-Type: application/json');
var resp = req.post(
'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + encodeURIComponent(p.To),
JSON.stringify({msgtype: 'text', text: {content: p.Subject + '\n' + p.Message}})
);
if (req.getStatus() !== 200 || JSON.parse(resp).errcode !== 0) {
throw 'WeCom send failed: ' + resp;
}
return 'OK';
機器人的 key 填在使用者媒介的“Send to”裡,不要寫進指令碼,也不要貼到工單和聊天記錄裡;Reports → Action log 的收件人一欄會顯示這個值,只給需要的人開放檢視許可權。上線前用媒介列表裡的 Test 實際發一條,確認群裡能收到。釘釘自定義機器人的位址是 https://oapi.dingtalk.com/robot/send?access_token=…,訊息體同樣是 msgtype: text 格式,機器人安全設定裡必須在自定義關鍵詞、加簽、IP 位址段中至少選一種;飛書機器人位址形如 https://open.feishu.cn/open-apis/bot/v2/hook/…,訊息體寫成 {"msg_type":"text","content":{"text":"…"}}。
3. 給使用者新增媒介。 在 Users → Users 開啟使用者,Media 標籤頁點 Add:選媒介型別,填收件位址或機器人 key,When active 寫生效時段,例如 1-5,09:00-18:00 表示工作日白天;下面勾選要接收的嚴重級別。使用者所在的使用者組必須對主機所在的群組至少有隻讀許可權,否則收不到這台主機的告警。
4. 建立動作。 在 Alerts → Actions → Trigger actions 新建:
- 條件:Trigger severity is greater than or equals Average,並且 Host group equals IDC/SH01;
- 操作:Default operation step duration 設為 30m;第 1 步發給“網路值班”使用者組,媒介選 All;第 2 步發給“維運主管”,並在這一步加上條件 Event is not acknowledged,即 30 分鐘內沒人確認才升級;
- 恢復操作:Notify all involved,問題恢復時通知所有收到過告警的人。
保持 Pause operations for suppressed problems 勾選,維護期內的問題就不會發通知。收不到告警時,到 Reports → Action log 查每條通知的傳送結果和報錯。
日常檢視與維護
- 處理問題:Monitoring → Problems 按嚴重級別和主機群組篩選,點問題行的 Update 可以確認(Acknowledge)並留言、修改嚴重級別、臨時抑制到某個時間點,觸發器允許時還可以手動關閉。確認過的問題不會再觸發“未確認才升級”的那一步。
- 看最新資料和圖形:Monitoring → Latest data 按主機、名稱或標籤篩選監控項,數值型監控項右側有 Graph 連結,文字型有 History。時間範圍用頁面右上角的選擇器,可以快速切到最近 1 小時、最近 7 天或自定義時段。
- 做一個機房總覽儀表盤:在 Dashboards 裡新建儀表盤,放 Problems by severity(各群組問題數)、Top hosts(按 CPU 或連接埠流量排序)、Graph(出口連接埠進出流量)和 Honeycomb(主機健康狀態)幾個元件,值班大屏一頁就能看全。
- 割接設維護期:Data collection → Maintenance → Create maintenance period,選擇帶資料採集(With data collection)還是不採集,設定生效時間和週期(例如 One time only,週六 01:00 起持續 2 小時),選中要割接的主機或群組。帶資料採集的維護期內問題照常記錄,但會被標記為已抑制,不發通知。
- 下架主機:伺服器下架時先把主機狀態設為 Disabled,停止採集但保留歷史資料;確認不再需要這些資料後再刪除主機。
在管理系統裡怎麼落地
Zabbix 告訴你哪台主機、哪個連接埠出了問題,處理時還要知道它接在哪、怎麼遠端進去。在 Toplink DCIM 的伺服器列表裡可以直接看到每台機器接在哪台交換器的哪個連接埠、連接埠速率和 VLAN,連接埠的開關、VLAN 修改和限速也能在網頁上完成(見交換器管理);伺服器系統卡死、Zabbix 報 agent 不可達時,可以透過 IPMI 遠端管理開啟控制檯檢視螢幕,必要時遠端重啟。上文提到的欠費停機連接埠也是一個銜接點:在 DCIM 裡關閉連接埠之前,先把 Zabbix 裡這個連接埠的 {$IFCONTROL} 上下文宏設為 0,恢復服務後再刪掉這條宏,值班人員就不會被預期內的連接埠 down 打擾。
常見問題
主機的 ZBX 圖示變紅,提示連不上 agent 怎麼辦?
先在 Zabbix server 上執行 zabbix_get -s 主機IP -k agent.ping。超時多半是被監控主機的防火牆沒放行 10050;連線被拒說明 agent 沒啟動;如果提示 Check access restrictions in Zabbix agent configuration,是 agent 配置檔案的 Server= 裡沒有寫 server 的位址。改完 agent 配置要重啟 agent。
一台主機能同時套多個範本嗎?
可以,例如伺服器同時套 Linux by Zabbix agent 和 Chassis by IPMI。但多個範本裡不能有鍵名相同的監控項,否則儲存時會報衝突;同類的範本只選一個,比如被動模式和主動模式的兩個 Linux 範本不要同時套。
怎麼一次修改幾十台主機?
在 Data collection → Hosts 勾選主機,點列表下方的 Mass update,可以批次增刪範本、修改主機群組、宏、IPMI 設定和資產清單欄位。數量再多,可以用 Zabbix API 的 host.massupdate,或者把主機配置匯出成 YAML 修改後再匯入。