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