關鍵詞:Cacti、微信告警
摘要:現實生產環境中,我們通常使用郵件和短信接受cacti告警信息,但是郵件經常被工作人員擱置在角落中甚至被設置為垃圾郵件被過濾掉;而公司的短信接口又太貴,復雜環境中使用短息告警會使運維成本增加很多。微信提供了很好的第三方接口,我們可以利用微信告警以求降低運維成本。
案例描述
本案例以實際實現cacti微信告警來完成整個過程的撰寫
案例分析
本案例以微信企業號推送消息的形式來推送cacti告警,只需要在原有cacti告警機制的基礎上修改部分代碼即可實現,節約成本的同時也增加了告警方式的多樣性
3 解決過程
3.1申請微信企業公眾號
1、申請微信企業公眾號https://qy.weixin.qq.com/,填寫基本信息,需使用郵箱注冊
2、郵箱收到驗證郵件后激活帳號
3、選擇類型為企業號,群發消息沒有限制
4、信息登記選擇團體,這樣不需要企業組織機構代碼等信息,只需要實名和手機認證即可,減少了很多不必要的麻煩,但同時也能夠滿足基本的需求
-
填寫微信企業公眾號相關信息之后,公眾號即可申請成功
3.2微信企業公眾號設置
1、通訊錄中添加子部門
2、通訊錄中添加成員,然后邀請成員關注(注意:微信企業公眾號需要通過管理者的邀請才能關注該企業公眾號,直接掃碼關注是無法關注成功的,只有在通訊錄的用戶且信息匹配才能關注成功)
首先新增成員
成員添加成功后即可邀請關注,可通過將二維碼分享給成員
3、應用中心添加應用,通過應用發送消息給部門成員
添加消息型應用
設置可見范圍
注意:此處應用ID很重要,后面會用到
4、新建普通管理組,獲取CorpID和Secret,並賦予相應的權限
設置--->功能設置---->權限管理---->新建普通管理組
設置權限,可以設置通訊錄權限和應用權限
設置通訊錄權限
設置應用權限
保存后獲取到CorpID和Secret,並獲取到相應的權限
3.3驗證微信企業公共號發送消息功能
-
使用發消息功能直接發送消息功能
-
使用企業號開發者中心接口文檔來驗證發送消息功能
使用CorpID和Secret獲取access_token
使用access_token調用接口,發送消息
此處body內容可參考文檔接口中的發送消息中的消息類型及數據格式進行更改
參數 |
必須 |
說明 |
touser |
否 |
成員ID列表(消息接收者,多個接收者用'|'分隔,最多支持1000個)。特殊情況:指定為@all,則向關注該企業應用的全部成員發送 |
toparty |
否 |
部門ID列表,多個接收者用'|'分隔,最多支持100個。當touser為@all時忽略本參數 |
totag |
否 |
標簽ID列表,多個接收者用'|'分隔,最多支持100個。當touser為@all時忽略本參數 |
msgtype |
是 |
消息類型,此時固定為:text (支持消息型應用跟主頁型應用) |
agentid |
是 |
企業應用的id,整型。可在應用的設置頁面查看 |
content |
是 |
消息內容,最長不超過2048個字節,注意:主頁型應用推送的文本消息在微信端最多只顯示20個字(包含中英文) |
safe |
否 |
表示是否是保密消息,0表示否,1表示是,默認0 |
{ "touser":"@all", "toparty":"@all", "totag":"@all", "msgtype":"text", "agentid":"1", # agentid是在添加應用中的ID號 "text":{ "content":"This is a test message" }, "safe":"0" } |
此時查看已關注該企業公眾號的微信,會收到相應的消息
3.4設置cacti實現微信告警
1、將cacti中thold的報警內容導出至文本文件進行保存
進入cacti主目錄, vim plugins/thold/thold_functions.php
查找2839行$text位置 上方插入語句
$msg_wx = strip_tags(str_replace('<br>', "\n", $message)); //刪除message中的html標簽,並將<br>替換為換行符\n $msg_wx = trim($msg_wx); //整理msg_wx字符串 $msg_wx = iconv( "GB2312//IGNORE", "UTF-8", $msg_wx); //轉換編碼為utf-8,防止亂碼 $sub_wx = iconv( "GB2312//IGNORE", "UTF-8", $subject); //轉換編碼為utf-8,防止亂碼 $file_title = '/tmp/title.txt'; //要寫入文件的文件名(可以是任意文件名),如果文件不存在,將會創建一個 $file_message = '/tmp/message.txt'; //要寫入文件的文件名(可以是任意文件名),如果文件不存在,將會創建一個 if($f = file_put_contents($file_title, $sub_wx)) //將subject參數的值保存到file_title中 if($f = file_put_contents($file_message, $msg_wx)) //將msg_wx參數的值保存到file_message中 shell_exec("/etc/wechat.sh"); //運行wechat.sh文件,進行微信報警操作 |
2、創建微信發送腳本
touch /etc/wechat.sh
chmod +x /etc/wechat.sh
wechat.sh中插入以下內容
#微信企業號發送消息腳本 #!/bin/bash CropID='wx60xxxxxxxxx2f9fa' #此處CropID請根據實際情況填寫 Secret='olJZsHEb3ihsB5NQgeQxheXXXXXXXBpvG-Rrj04XhI0daMP7ca5FKRLbw6' #此處Secret請根據實際情況填寫 GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret" Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $4}') PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken" function body() { local int AppID=1 #Appid 填寫企業號中建立的報警APP的ID Ent=$'\n' Date=$(date '+%Y年%m月%d日 %H:%M:%S\n\n') #添加Cacti微信報警日期參數 Tit=$(cat /tmp/title.txt) #讀取/tmp/title文件中內容到變量Tit Msg=$Date$Tit$Ent$(cat /tmp/message.txt|sed 's/%//g') #拼接msg主體文件,包含日期,主題,報警內容.並刪除報警內容中的'%'號. Url=$(grep "http" /tmp/message.txt|sed 's/URL: //g') #獲取message.txt中的url行內容 Pic_tmp=$(grep "http" /tmp/message.txt|sed 's/URL: //g'|sed 's/\/graph.php/\/graph_image.php/g') if [ ! -n "$Pic_tmp" ] ;then Pic="" else Pic=$Pic_tmp$'&graph_height=130&graph_width=420&t='$Date fi #根據url行內容修改為添加Pic參數 #在此修改圖片大小,防止圖像顯示不全,並判斷圖片文件是否存在。防止宕機出現圖片報警 printf '{\n' printf '\t"touser": "'"@all"\"",\n" printf '\t"toparty": "'"@all"\"",\n" printf '\t"totag": "'"@all"\"",\n" printf '\t"msgtype": "news",\n' #使用news消息類型 printf '\t"agentid": "'" $AppID "\"",\n" printf '\t"news": {\n' printf '\t"articles": [\n' printf '{\n' printf '\t\t"title": "'"$Tit"\","\n" printf '\t\t"description": "'"$Msg"\","\n" printf '\t\t"url": "'"$Url"\","\n" printf '\t\t"picurl": "'"$Pic"\","\n" printf '\t}\n' printf '\t]\n' printf '\t}\n' printf '}\n' } /usr/bin/curl --data-ascii "$(body )" $PURL #傳送憑證調用企業號接口 |
body內容可參考文檔接口中的發送消息中的消息類型及數據格式進行更改
參數 |
必須 |
說明 |
touser |
否 |
成員ID列表(消息接收者,多個接收者用'|'分隔,最多支持1000個)。特殊情況:指定為@all,則向關注該企業應用的全部成員發送 |
toparty |
否 |
部門ID列表,多個接收者用'|'分隔,最多支持100個。當touser為@all時忽略本參數 |
totag |
否 |
標簽ID列表,多個接收者用'|'分隔,最多支持100個。當touser為@all時忽略本參數 |
msgtype |
是 |
消息類型,此時固定為:news (不支持主頁型應用) |
agentid |
是 |
企業應用的id,整型。可在應用的設置頁面查看 |
articles |
是 |
圖文消息,一個圖文消息支持1到8條圖文 |
title |
否 |
標題,不超過128個字節,超過會自動截斷 |
description |
否 |
描述,不超過512個字節,超過會自動截斷 |
url |
否 |
點擊后跳轉的鏈接。 |
picurl |
否 |
圖文消息的圖片鏈接,支持JPG、PNG格式,較好的效果為大圖640*320,小圖80*80。如不填,在客戶端不顯示圖片 |
3、修改graph_image.php文件,取消graph_image.php的認證,否則微信無法正常顯示圖片
#include("./include/auth.php"); include_once("./lib/rrd.php"); include("./include/global.php"); api_plugin_hook_function('graph_image'); |
4、以下是微信告警信息與手機郵箱收到的告警信息對比
微信告警消息 郵件告警消息
4 解決結果
通過參考本案例,可以完成實現cacti的微信告警功能,增加了告警方式,實現多種告警方式並存
5 總結
本案例方法是通過命令抓取郵件告警的標題和內容然后調用微信企業公眾號發送消息接口來實現微信告警,因此需要在創建閥值的時候添加告警郵箱,並配置好郵件服務器,保證觸發閾值告警后郵箱能收到告警郵件,如果沒有告警郵件的話,微信報警也是不生效的。