使用企業(yè)微信發(fā)送Zabbix告警信息
Zabbix作為一款傳統(tǒng)的監(jiān)控軟件一直保持穩(wěn)定的迭代,到目前為止穩(wěn)定版已經(jīng)更新到5.4了。Zabbix內(nèi)置非常多現(xiàn)成的監(jiān)控項(xiàng),從操作系統(tǒng)到常用的軟件Redis、MySQL等,幾乎都可以找到對(duì)應(yīng)的監(jiān)控項(xiàng),差不多可以做到零配置就實(shí)現(xiàn)操作系統(tǒng)三大件:CPU、硬盤、內(nèi)存的監(jiān)控。此外Linux和Windows,Zabbix都支持。
Zabbix內(nèi)置豐富的告警媒介,但很遺憾沒(méi)有內(nèi)置企業(yè)微信告警。企業(yè)微信在很多公司都有使用,得益于它強(qiáng)大的消息推送API,我們可以自己實(shí)現(xiàn)使用企業(yè)微信作為告警媒介,本文就從零開始介紹如何使用企業(yè)微信發(fā)送Zabbix告警。
一、企業(yè)微信配置相關(guān)
瀏覽器登錄企業(yè)微信管理后臺(tái),在“應(yīng)用管理”中創(chuàng)建自建應(yīng)用,如下圖:
自建應(yīng)用
得到三個(gè)重要的參數(shù):“AgentId”、“Secret”和“企業(yè)ID”,前兩個(gè)參數(shù)在自建的應(yīng)用里面可以看到,“企業(yè)ID”需要到“我的企業(yè)”->“企業(yè)信息”底部查看。
這里有一點(diǎn)要注意,在自建應(yīng)用中有個(gè)“可見(jiàn)范圍”需要填寫正確,如下面公司架構(gòu),
通訊錄
如果接受告警的人在dev組,那么要將“自建應(yīng)用”中的“可見(jiàn)范圍”設(shè)為“dev”或者直接設(shè)置為“念一顧問(wèn)”,如果設(shè)置錯(cuò)了,要接受告警的人是收不到告警信息的,因?yàn)樗床坏竭@個(gè)自建應(yīng)用。
可見(jiàn)范圍配置
二,告警通道腳本編寫
Zabbix的告警媒介類型可以選擇腳本,其由系統(tǒng)管理員提供,這就是zabbix強(qiáng)大的地方。依賴自定義腳本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)
運(yùn)行腳本的三個(gè)參數(shù)通過(guò)zabbix傳入。(關(guān)于模塊dotenv的用法可參考Python開發(fā)中如何正確處理憑據(jù))
查看zabbix server的配置文件:
/etc/zabbix/zabbix_server.conf,查找參數(shù)“AlertScriptsPath”的值,將腳本放到其指定的目錄中。(本文使用的操作系統(tǒng)是CentOS 7)
三,Zabbix配置
作者使用的zabbix版本為5.0,其他版本可能會(huì)有差異。有三個(gè)地方需要配置,
“管理”->“報(bào)警媒介類型”增加告警類型,如下:
告警媒介配置
其中“腳本參數(shù)”與上面python腳本接收參數(shù)對(duì)應(yīng)。
在“管理”->“用戶”中為zabbix用戶配置“報(bào)警媒介”,可以配置多個(gè),這里僅配置“企業(yè)微信”告警媒介,
用戶配置告警媒介
“配置”->“動(dòng)作”添加動(dòng)作并指定對(duì)應(yīng)的操作,如下:
動(dòng)作
配置動(dòng)作實(shí)際的操作
上面兩幅圖用一句話描述:當(dāng)觸發(fā)器的級(jí)別是嚴(yán)重級(jí)別時(shí),通過(guò)自定義腳本發(fā)送告警給zabbix管理員用戶組。選擇“Custom message”,其中“主題”的內(nèi)容為
{TRIGGER.STATUS}: {TRIGGER.NAME}
消息的內(nèi)容為:
<font color="warning">告警等級(jí):嚴(yán)重</font>
告警主機(jī):{HOSTNAME1}
告警時(shí)間:{EVENT.DATE} {EVENT.TIME}
告警信息:{TRIGGER.NAME}
告警項(xiàng)目:{TRIGGER.KEY1}
問(wèn)題詳情:{ITEM.NAME}:{ITEM.VALUE}
當(dāng)前狀態(tài):{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
這里只定義了一個(gè)步驟,如果需要加入多個(gè)步驟,點(diǎn)擊“添加”即可,比如要實(shí)現(xiàn)告警先給普通員工發(fā)送,如果一個(gè)小時(shí)內(nèi)沒(méi)有確認(rèn),向更高一級(jí)的管理層發(fā)送就在這里實(shí)現(xiàn)?!盎謴?fù)操作”和“更新操作”類似,不再贅述。
下圖是實(shí)際告警示例,因?yàn)楦婢瘍?nèi)容支持markdown格式,將告警級(jí)別著重展示,引起收到告警的相關(guān)負(fù)責(zé)人重視。
實(shí)際告警
總結(jié)
文章對(duì)Zabbix使用企業(yè)微信作為告警媒介原理進(jìn)行了介紹。其他類似的應(yīng)用,實(shí)現(xiàn)原理也是相通的,希望這篇文章能幫到正在努力的你。