Zabbix問題告警如何實現(xiàn)處理閉環(huán)?

一、搭建Zabbix6.2平臺
?通過Docker快速搭建Zabbix 6.2的最新版本。
1.1、創(chuàng)建Zabbix專屬網(wǎng)絡
創(chuàng)建Zabbix組件虛擬子網(wǎng):Zabbix-Subnet
docker network create --subnet 172.10.0.0/16 --ip-range 172.10.240.0/20 Zabbix-Subnet1.2、運行Zabbix MySQL容器
選擇MySQL8.0作為Zabbix監(jiān)控數(shù)據(jù)的存儲引擎。
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_password1.3、運行Zabbix Server容器
本文使用企業(yè)微信群機器人作為告警媒介,為確保容器能正常請求Webhook地址,通過--add-host綁定hosts實現(xiàn)強制解析,可根據(jù)實際情況配置。
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-latest1.4、運行Zabbix Agent2容器
Zabbix Agent2基于Go語言開發(fā),作為Zabbix Agent替代品,它幾乎集成了Zabbix Agent原有的所有功能,且易于通過Go插件實現(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已內置證書校驗功能,再無需通過復雜的openssl的腳本實現(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、運行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-latest1.6、配置Zabbix Agent
?Zabbix-Server容器啟動時已配置鏈接到Zabbix-Agent,容器內部可直接找到,故這里的接口類型使用DNS方式即可。

?批量創(chuàng)建Zabbix-AgentN容器并正確配置后,稍等片刻再次刷新儀表盤,查看已能正常收集數(shù)據(jù)。

二、創(chuàng)建Zabbix用戶和告警媒介
2.1、添加Zabbix告警用戶
?目前Zabbix已具備完整的用戶權限管理體系,我們可以通過設置不同群組不同用戶授予不同操作和查看權限,滿足運維團隊的精細化管理。
?根據(jù)系統(tǒng)保障團隊特點,通常需要創(chuàng)建一、二線兩種運維角色。通過左側導航->管理->用戶群組,創(chuàng)建一個名為 系統(tǒng)保障團隊的群組,主機權限視具體情況勾選主機群組、并授予 讀或 讀寫,如下圖所示:

?左側導航->管理->用戶,創(chuàng)建兩個Zabbix Web用戶,"用戶名"分別為:servicedesk、appadmin,"用戶名第一部分"分別為:運維服務臺(一線)、應用運維(二線)。群組均為:系統(tǒng)保障團隊,如下圖所示:

?切到用戶權限頁,勾選角色為:User role,當然這里可視實際情況而定,如下圖所示:

2.2、添加企業(yè)微信群機器人
?創(chuàng)建一個Zabbix告警通知專用企微群,通過群窗口進入管理界面。點擊添加群機器人賦予名字后,復制地址獲取完整WebHook鏈接。

2.3、創(chuàng)建Webhook告警媒介
?左側導航->管理->媒介->創(chuàng)建媒介類型,填入名稱"WXWork_RoBot",點擊編輯腳本,復制以下內容進行填充。
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、測試Webhook告警媒介
?Zabbix Web端同樣提供WebHook媒介的測試,以便驗證配置的正確性。通過左側導航->管理->媒介,找到"WXWork_RoBot",在動作列點擊 測試。參數(shù)說明:
HTTPProxyHTTP代理:留空
Message消息體輸入:"測試內容、測試內容"
Subject標題體輸入"# 測試標題"
To發(fā)送體輸入:企微Webhook機器人完整鏈接

?點擊下方測試,如無例外,在企微專用告警群里,你會收到機器人 小Z發(fā)出的如下消息:

?假若告警媒介出現(xiàn)問題,JS腳本會自動拋出對應異常信息,如下圖所示:

?如下是輸入錯誤的企微機器人地址后拋出的異常
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告警動作
?Zabbix的告警動作對檢測到的異常采取不同的通知措施。這里,通過左側導航->配置->動作->觸發(fā)器動作,創(chuàng)建三種告警動作:告警動作、告警恢復動作、告警更新動作,來實現(xiàn)系統(tǒng)保障團隊對告警的閉環(huán)處理。
?系統(tǒng)保障團隊可通過自身情況選擇將不同告警階段動作的信息發(fā)送給不同的團隊。配置過程中,三種告警動作參數(shù)全部保持一致,即發(fā)給用戶組 Admin(Zabbix Administrator)、僅送到告警媒介 WXWork_Robot。

?關于告警動作解釋:
告警動作,即當告警出現(xiàn)時,Zabbix將告警信息發(fā)送給哪些用戶.
告警恢復動作,即當告警恢復時,Zabbix將告警信息發(fā)送給哪些用戶。
告警恢復動作,即當告警信息變化時,Zabbix將變化發(fā)送給哪些用戶。
?最終觸發(fā)器告警動作的完整視圖,如下圖所示:

2.6、配置Zabbix告警消息模板
?Zabbix告警動作需要結合對應報警媒介中的消息模板完成告警消息的推送,這里的消息模板分別對應前面配置三個告警動作,即:
告警動作->消息模板:問題
告警恢復動作->消息模板:問題恢復
告警更新動作->消息模板:問題更新
?最終配置,如下圖所示:



三、Zabbix6.2動作之更新操作通知
3.1、觸發(fā)Zabbix告警消息
?為了校驗告警有效性,通常需要人為觸發(fā)告警。當然,觸發(fā)方式由很多種,你可以縮短item收集時間,也可以暴力直接拉升服務器負載。
?這里通過Zabbix Agent節(jié)點執(zhí)行dd命令,迅速拉滿節(jié)點CPU,觸發(fā)Zabbix告警。
cpu_count=`cat /proc/cpuinfo | grep "physical id" | wc -l`;echo "當前節(jié)點核心數(shù): ${cpu_count} 個";for i in `seq 1 ${cpu_count}`; do echo -e "--------\n正在拉滿核心${i}"; dd if=/dev/zero of=/dev/null & sleep 5; done
當前節(jié)點核心數(shù): 2 個
--------
正在拉滿核心1
[1] 5802
--------
正在拉滿核心2
[2] 5807?通過 top -H很快就能看到 CPU idel值已接近或處于0,告警在即。

PS:結束上述命令可以使用 pkill -9 dd
3.2、接收Zabbix告警消息
?人為觸發(fā)告警后,一線服務臺巡檢或聽到告警音(如啟用)儀表盤時,就會已看到告警條。

?在企微專用告警群里,成功接收到告警信息,如下圖所示:

3.3、處置Zabbix告警消息
?按系統(tǒng)保障團隊工作流程機制,一線服務臺需要在限定時間內電話知達當日值班二線或相關服務負責人。此時一線服務臺在儀表盤上,點擊告警條上的"否",對問題進行跟蹤反饋。

?1)此時在告警群里,已看到一線服務臺對Zabbix告警信息做出響應。

?2)當日值班二線或相關服務負責人收到告警后,立即對告警問題進行處置,如解決問題得到解決,對告警信息進行評價。

?3)Zabbix監(jiān)控繼續(xù)對問題項進行檢索,如滿足恢復條件,自動發(fā)送告警恢復信息。

?4)一線服務臺接收到恢復告警后,確認并記錄問題,最終完成整個告警問題的閉環(huán)處理。

?根據(jù)經(jīng)驗,在運維事件管理中,有效地記錄系統(tǒng)保障人員的問題處理時間和根因分析,定期做復盤,這對提升團隊的服務質量有很大的幫助。
四、小結
?除了可以在線反饋問題處理進度外,Zabbix告警確認(ACK)功能還能改變告警等級從嚴或簡單處理,通過也能對告警通知信息進行抑制和屏蔽。















 
 
 











 
 
 
 