Zabbix作為一款傳統(tǒng)的監(jiān)控軟件一直保持穩(wěn)定的迭代,到目前為止穩(wěn)定版已經(jīng)更新到5.4了。Zabbix內(nèi)置非常多現(xiàn)成的監(jiān)控項,從操作系統(tǒng)到常用的軟件Redis、MySQL等,幾乎都可以找到對應(yīng)的監(jiān)控項,差不多可以做到零配置就實現(xiàn)操作系統(tǒng)三大件:CPU、硬盤、內(nèi)存的監(jiān)控。此外Linux和Windows,Zabbix都支持。
Zabbix內(nèi)置豐富的告警媒介,但很遺憾沒有內(nèi)置企業(yè)微信告警。企業(yè)微信在很多公司都有使用,得益于它強大的消息推送API,我們可以自己實現(xiàn)使用企業(yè)微信作為告警媒介,本文就從零開始介紹如何使用企業(yè)微信發(fā)送Zabbix告警。
一、企業(yè)微信配置相關(guān)
瀏覽器登錄企業(yè)微信管理后臺,在“應(yīng)用管理”中創(chuàng)建自建應(yīng)用,如下圖:
自建應(yīng)用
得到三個重要的參數(shù):“AgentId”、“Secret”和“企業(yè)ID”,前兩個參數(shù)在自建的應(yīng)用里面可以看到,“企業(yè)ID”需要到“我的企業(yè)”->“企業(yè)信息”底部查看。
這里有一點要注意,在自建應(yīng)用中有個“可見范圍”需要填寫正確,如下面公司架構(gòu),
通訊錄
如果接受告警的人在dev組,那么要將“自建應(yīng)用”中的“可見范圍”設(shè)為“dev”或者直接設(shè)置為“念一顧問”,如果設(shè)置錯了,要接受告警的人是收不到告警信息的,因為他看不到這個自建應(yīng)用。
可見范圍配置
二,告警通道腳本編寫
Zabbix的告警媒介類型可以選擇腳本,其由系統(tǒng)管理員提供,這就是zabbix強大的地方。依賴自定義腳本POST告警消息到企業(yè)微信的API,具體可以查看企業(yè)微信相關(guān)文檔,這里直接上腳本(支持發(fā)送markdown格式的內(nèi)容):
#!/bin/python3.7 import requests import json import sys import os from dotenv import load_dotenv def get_token(corpid, secret): url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" data = { "corpid": corpid, "corpsecret": secret } response = requests.get(url=url, params=data) if response.json()['errcode'] != 0: return False else: token = response.json()["access_token"] # 保存token,方便下次使用 with open('/usr/lib/zabbix/alertscripts/.zabbix_wechat_config.json', 'w') as file: file.write(response.text) return token def send_message(user, subject, content, partyid="", agentid=1000002): load_dotenv() try: with open('/usr/lib/zabbix/alertscripts/.zabbix_wechat_config.json', 'r') as file: token = json.load(file)["access_token"] except: token = get_token(os.environ.get('corpid'), os.environ.get('secret')) url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % token data = { "touser": user, #"totag": Tagid, "toparty": partyid, "msgtype": "markdown", "agentid": agentid, "markdown": { "content": subject + '\n' + content }, "safe": "0" } #企業(yè)微信的markdown格式的內(nèi)容必須使用utf-8編碼 data = json.dumps(data, ensure_ascii=False).encode(encoding="utf-8") response = requests.post(url=url, data=data) # 如果發(fā)送失敗,重試四次 n = 0 while response.json()['errcode'] != 0 and n < 4: n += 1 token = get_token(os.environ.get('corpid'), os.environ.get('secret')) if token: url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % token data = json.dumps(data, ensure_ascii=False).encode(encoding="utf-8") response = requests.post(url=url, data=data) print(response.json()) return response.json() if __name__ == "__main__": user = sys.argv[1] subject = str(sys.argv[2]) content = str(sys.argv[3]) status = send_message(user, subject, content) print(status)
運行腳本的三個參數(shù)通過zabbix傳入。(關(guān)于模塊dotenv的用法可參考Python開發(fā)中如何正確處理憑據(jù))
查看zabbix server的配置文件:
/etc/zabbix/zabbix_server.conf,查找參數(shù)“AlertScriptsPath”的值,將腳本放到其指定的目錄中。(本文使用的操作系統(tǒng)是CentOS 7)
三,Zabbix配置
作者使用的zabbix版本為5.0,其他版本可能會有差異。有三個地方需要配置,
“管理”->“報警媒介類型”增加告警類型,如下:
告警媒介配置
其中“腳本參數(shù)”與上面python腳本接收參數(shù)對應(yīng)。
在“管理”->“用戶”中為zabbix用戶配置“報警媒介”,可以配置多個,這里僅配置“企業(yè)微信”告警媒介,
用戶配置告警媒介
“配置”->“動作”添加動作并指定對應(yīng)的操作,如下:
動作
配置動作實際的操作
上面兩幅圖用一句話描述:當(dāng)觸發(fā)器的級別是嚴(yán)重級別時,通過自定義腳本發(fā)送告警給zabbix管理員用戶組。選擇“Custom message”,其中“主題”的內(nèi)容為
{TRIGGER.STATUS}: {TRIGGER.NAME}
消息的內(nèi)容為:
<font color="warning">告警等級:嚴(yán)重</font> 告警主機:{HOSTNAME1} 告警時間:{EVENT.DATE} {EVENT.TIME} 告警信息:{TRIGGER.NAME} 告警項目:{TRIGGER.KEY1} 問題詳情:{ITEM.NAME}:{ITEM.VALUE} 當(dāng)前狀態(tài):{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}
這里只定義了一個步驟,如果需要加入多個步驟,點擊“添加”即可,比如要實現(xiàn)告警先給普通員工發(fā)送,如果一個小時內(nèi)沒有確認(rèn),向更高一級的管理層發(fā)送就在這里實現(xiàn)。“恢復(fù)操作”和“更新操作”類似,不再贅述。
下圖是實際告警示例,因為告警內(nèi)容支持markdown格式,將告警級別著重展示,引起收到告警的相關(guān)負(fù)責(zé)人重視。
實際告警
總結(jié)
文章對Zabbix使用企業(yè)微信作為告警媒介原理進行了介紹。其他類似的應(yīng)用,實現(xiàn)原理也是相通的,希望這篇文章能幫到正在努力的你。
原文地址:https://www.toutiao.com/a7033706124310643213/