Zabbix問(wèn)題告警如何實(shí)現(xiàn)處理閉環(huán)?
一、搭建Zabbix6.2平臺(tái)
?通過(guò)Docker快速搭建Zabbix 6.2的最新版本。
1.1、創(chuàng)建Zabbix專屬網(wǎng)絡(luò)
創(chuàng)建Zabbix組件虛擬子網(wǎng):Zabbix-Subnet
docker network create --subnet 172.10.0.0/16 --ip-range 172.10.240.0/20 Zabbix-Subnet
1.2、運(yùn)行Zabbix MySQL容器
選擇MySQL8.0作為Zabbix監(jiān)控?cái)?shù)據(jù)的存儲(chǔ)引擎。
docker run --name Zabbix-MySQL -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-v /etc/localtime:/etc/localtime:ro \
-d mysql:8.0 \
--character-set-server=utf8 \
--collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password
1.3、運(yùn)行Zabbix Server容器
本文使用企業(yè)微信群機(jī)器人作為告警媒介,為確保容器能正常請(qǐng)求Webhook地址,通過(guò)--add-host綁定hosts實(shí)現(xiàn)強(qiáng)制解析,可根據(jù)實(shí)際情況配置。
docker run --name Zabbix-Server -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
--hostname="Zabbix-Server" \
-e DB_SERVER_HOST="Zabbix-MySQL" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-e ZBX_NODEADDRESS="Zabbix-Server" \
-v /etc/localtime:/etc/localtime:ro \
-p 10051:10051 \
--add-host qyapi.weixin.qq.com:157.148.55.111 \
-d zabbix/zabbix-server-mysql:alpine-6.2-latest
1.4、運(yùn)行Zabbix Agent2容器
Zabbix Agent2基于Go語(yǔ)言開發(fā),作為Zabbix Agent替代品,它幾乎集成了Zabbix Agent原有的所有功能,且易于通過(guò)Go插件實(shí)現(xiàn)第三方功能。
docker run --name Zabbix-Agent -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e ZBX_HOSTNAME="Zabbix server" \
-e ZBX_SERVER_HOST="Zabbix-Server" \
-e ZBX_SERVER_PORT="10051" \
-v /etc/localtime:/etc/localtime:ro \
--privileged \
-d zabbix/zabbix-agent2:alpine-6.2-latest
?值得提及的是,Zabbix Agent2已內(nèi)置證書校驗(yàn)功能,再無(wú)需通過(guò)復(fù)雜的openssl的腳本實(shí)現(xiàn),效果如下:
docker exec -it Zabbix-Server zabbix_get -s Zabbix-Agent -k web.certificate.get[zabbix.com,,104.26.7.148] | python -m json.tool
{
"result": {
"message": "certificate verified successfully",
"value": "valid"
},
"sha1_fingerprint": "8b5889c0a9ecb12a7f4ec1e2c91d70eebb70aa4a",
"sha256_fingerprint": "22a31bd36212fd11bedaba8a3cd66e113710d68c2725b37ebd8c10c2ff49cc56",
"x509": {
"alternative_names": [
"*.zabbix.com",
"zabbix.com",
"sni.cloudflaressl.com"
],
"issuer": "CN=Cloudflare Inc ECC CA-3,O=Cloudflare\\, Inc.,C=US",
"not_after": {
"timestamp": 1685750399,
"value": "Jun 02 23:59:59 2023 GMT"
},
"not_before": {
"timestamp": 1654214400,
"value": "Jun 03 00:00:00 2022 GMT"
},
"public_key_algorithm": "ECDSA",
"serial_number": "014937aa9f28ce4846ddfb7109cbfb0e",
"signature_algorithm": "ECDSA-SHA256",
"subject": "CN=sni.cloudflaressl.com,O=Cloudflare\\, Inc.,L=San Francisco,ST=California,C=US",
"version": 3
}
}
1.5、運(yùn)行Zabbix Web容器
選擇Nginx作為ZabbixWeb前端引擎。
docker run --name Zabbix-Web -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e PHP_TZ="Asia/Shanghai" \
-e DB_SERVER_HOST="Zabbix-MySQL" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-v /etc/localtime:/etc/localtime:ro \
-p 80:8080 \
-d zabbix/zabbix-web-nginx-mysql:alpine-6.2-latest
1.6、配置Zabbix Agent
?Zabbix-Server容器啟動(dòng)時(shí)已配置鏈接到Zabbix-Agent,容器內(nèi)部可直接找到,故這里的接口類型使用DNS方式即可。
?批量創(chuàng)建Zabbix-AgentN容器并正確配置后,稍等片刻再次刷新儀表盤,查看已能正常收集數(shù)據(jù)。
二、創(chuàng)建Zabbix用戶和告警媒介
2.1、添加Zabbix告警用戶
?目前Zabbix已具備完整的用戶權(quán)限管理體系,我們可以通過(guò)設(shè)置不同群組不同用戶授予不同操作和查看權(quán)限,滿足運(yùn)維團(tuán)隊(duì)的精細(xì)化管理。
?根據(jù)系統(tǒng)保障團(tuán)隊(duì)特點(diǎn),通常需要?jiǎng)?chuàng)建一、二線兩種運(yùn)維角色。通過(guò)左側(cè)導(dǎo)航->管理->用戶群組,創(chuàng)建一個(gè)名為 系統(tǒng)保障團(tuán)隊(duì)的群組,主機(jī)權(quán)限視具體情況勾選主機(jī)群組、并授予 讀或 讀寫,如下圖所示:
?左側(cè)導(dǎo)航->管理->用戶,創(chuàng)建兩個(gè)Zabbix Web用戶,"用戶名"分別為:servicedesk、appadmin,"用戶名第一部分"分別為:運(yùn)維服務(wù)臺(tái)(一線)、應(yīng)用運(yùn)維(二線)。群組均為:系統(tǒng)保障團(tuán)隊(duì),如下圖所示:
?切到用戶權(quán)限頁(yè),勾選角色為:User role,當(dāng)然這里可視實(shí)際情況而定,如下圖所示:
2.2、添加企業(yè)微信群機(jī)器人
?創(chuàng)建一個(gè)Zabbix告警通知專用企微群,通過(guò)群窗口進(jìn)入管理界面。點(diǎn)擊添加群機(jī)器人賦予名字后,復(fù)制地址獲取完整WebHook鏈接。
2.3、創(chuàng)建Webhook告警媒介
?左側(cè)導(dǎo)航->管理->媒介->創(chuàng)建媒介類型,填入名稱"WXWork_RoBot",點(diǎn)擊編輯腳本,復(fù)制以下內(nèi)容進(jìn)行填充。
try {
var params = JSON.parse(value),
request = new HttpRequest(),
msg = {
msgtype: 'markdown',
markdown: {
content: params.Subject + '\n' + params.Message
}
},
response;
if (params.HTTPProxy) {
request.setProxy(params.HTTPProxy);
}
request.addHeader('Content-Type: application/json');
response = request.post(params.To,JSON.stringify(msg)
);
response = JSON.parse(response);
if (request.getStatus() != 200) {
throw 'Response Status: ' + request.getStatus();
}
if (response.errcode !== 0) {
throw 'Response errcode: ' + response.errcode + '\n' + 'Response errmsg: ' + response.errmsg;
}
return JSON.stringify(response);
}catch (error) {
throw 'Sending failed: ' + error;
}
?其他參數(shù)保持和下圖一致即可。
2.4、測(cè)試Webhook告警媒介
?Zabbix Web端同樣提供WebHook媒介的測(cè)試,以便驗(yàn)證配置的正確性。通過(guò)左側(cè)導(dǎo)航->管理->媒介,找到"WXWork_RoBot",在動(dòng)作列點(diǎn)擊 測(cè)試。參數(shù)說(shuō)明:
HTTPProxyHTTP代理:留空
Message消息體輸入:"測(cè)試內(nèi)容、測(cè)試內(nèi)容"
Subject標(biāo)題體輸入"# 測(cè)試標(biāo)題"
To發(fā)送體輸入:企微Webhook機(jī)器人完整鏈接
?點(diǎn)擊下方測(cè)試,如無(wú)例外,在企微專用告警群里,你會(huì)收到機(jī)器人 小Z
發(fā)出的如下消息:
?假若告警媒介出現(xiàn)問(wèn)題,JS腳本會(huì)自動(dòng)拋出對(duì)應(yīng)異常信息,如下圖所示:
?如下是輸入錯(cuò)誤的企微機(jī)器人地址后拋出的異常
Sending failed: Response errcode: 93000 Response errmsg: invalid webhook url, hint: [1670835060365200618705084], from ip: x.x.x.x, more info at https://open.work.weixin.qq.com/devtool/query?e=93000
2.5、配置Zabbix告警動(dòng)作
?Zabbix的告警動(dòng)作對(duì)檢測(cè)到的異常采取不同的通知措施。這里,通過(guò)左側(cè)導(dǎo)航->配置->動(dòng)作->觸發(fā)器動(dòng)作,創(chuàng)建三種告警動(dòng)作:告警動(dòng)作、告警恢復(fù)動(dòng)作、告警更新動(dòng)作,來(lái)實(shí)現(xiàn)系統(tǒng)保障團(tuán)隊(duì)對(duì)告警的閉環(huán)處理。
?系統(tǒng)保障團(tuán)隊(duì)可通過(guò)自身情況選擇將不同告警階段動(dòng)作的信息發(fā)送給不同的團(tuán)隊(duì)。配置過(guò)程中,三種告警動(dòng)作參數(shù)全部保持一致,即發(fā)給用戶組 Admin(Zabbix Administrator)、僅送到告警媒介 WXWork_Robot。
?關(guān)于告警動(dòng)作解釋:
告警動(dòng)作,即當(dāng)告警出現(xiàn)時(shí),Zabbix將告警信息發(fā)送給哪些用戶.
告警恢復(fù)動(dòng)作,即當(dāng)告警恢復(fù)時(shí),Zabbix將告警信息發(fā)送給哪些用戶。
告警恢復(fù)動(dòng)作,即當(dāng)告警信息變化時(shí),Zabbix將變化發(fā)送給哪些用戶。
?最終觸發(fā)器告警動(dòng)作的完整視圖,如下圖所示:
2.6、配置Zabbix告警消息模板
?Zabbix告警動(dòng)作需要結(jié)合對(duì)應(yīng)報(bào)警媒介中的消息模板完成告警消息的推送,這里的消息模板分別對(duì)應(yīng)前面配置三個(gè)告警動(dòng)作,即:
告警動(dòng)作->消息模板:?jiǎn)栴}
告警恢復(fù)動(dòng)作->消息模板:?jiǎn)栴}恢復(fù)
告警更新動(dòng)作->消息模板:?jiǎn)栴}更新
?最終配置,如下圖所示:
三、Zabbix6.2動(dòng)作之更新操作通知
3.1、觸發(fā)Zabbix告警消息
?為了校驗(yàn)告警有效性,通常需要人為觸發(fā)告警。當(dāng)然,觸發(fā)方式由很多種,你可以縮短item收集時(shí)間,也可以暴力直接拉升服務(wù)器負(fù)載。
?這里通過(guò)Zabbix Agent節(jié)點(diǎn)執(zhí)行dd命令,迅速拉滿節(jié)點(diǎn)CPU,觸發(fā)Zabbix告警。
cpu_count=`cat /proc/cpuinfo | grep "physical id" | wc -l`;echo "當(dāng)前節(jié)點(diǎn)核心數(shù): ${cpu_count} 個(gè)";for i in `seq 1 ${cpu_count}`; do echo -e "--------\n正在拉滿核心${i}"; dd if=/dev/zero of=/dev/null & sleep 5; done
當(dāng)前節(jié)點(diǎn)核心數(shù): 2 個(gè)
--------
正在拉滿核心1
[1] 5802
--------
正在拉滿核心2
[2] 5807
?通過(guò) top -H很快就能看到 CPU idel值已接近或處于0,告警在即。
PS:結(jié)束上述命令可以使用 pkill -9 dd
3.2、接收Z(yǔ)abbix告警消息
?人為觸發(fā)告警后,一線服務(wù)臺(tái)巡檢或聽到告警音(如啟用)儀表盤時(shí),就會(huì)已看到告警條。
?在企微專用告警群里,成功接收到告警信息,如下圖所示:
3.3、處置Zabbix告警消息
?按系統(tǒng)保障團(tuán)隊(duì)工作流程機(jī)制,一線服務(wù)臺(tái)需要在限定時(shí)間內(nèi)電話知達(dá)當(dāng)日值班二線或相關(guān)服務(wù)負(fù)責(zé)人。此時(shí)一線服務(wù)臺(tái)在儀表盤上,點(diǎn)擊告警條上的"否",對(duì)問(wèn)題進(jìn)行跟蹤反饋。
?1)此時(shí)在告警群里,已看到一線服務(wù)臺(tái)對(duì)Zabbix告警信息做出響應(yīng)。
?2)當(dāng)日值班二線或相關(guān)服務(wù)負(fù)責(zé)人收到告警后,立即對(duì)告警問(wèn)題進(jìn)行處置,如解決問(wèn)題得到解決,對(duì)告警信息進(jìn)行評(píng)價(jià)。
?3)Zabbix監(jiān)控繼續(xù)對(duì)問(wèn)題項(xiàng)進(jìn)行檢索,如滿足恢復(fù)條件,自動(dòng)發(fā)送告警恢復(fù)信息。
?4)一線服務(wù)臺(tái)接收到恢復(fù)告警后,確認(rèn)并記錄問(wèn)題,最終完成整個(gè)告警問(wèn)題的閉環(huán)處理。
?根據(jù)經(jīng)驗(yàn),在運(yùn)維事件管理中,有效地記錄系統(tǒng)保障人員的問(wèn)題處理時(shí)間和根因分析,定期做復(fù)盤,這對(duì)提升團(tuán)隊(duì)的服務(wù)質(zhì)量有很大的幫助。
四、小結(jié)
?除了可以在線反饋問(wèn)題處理進(jìn)度外,Zabbix告警確認(rèn)(ACK)功能還能改變告警等級(jí)從嚴(yán)或簡(jiǎn)單處理,通過(guò)也能對(duì)告警通知信息進(jìn)行抑制和屏蔽。