背景
近來受朋友所托,為他實作cacti的微信告警功能,但是在印象之中,cacti的thold插件貌似隻有郵件告警功能吧?于是花了點時間在網絡上搜尋了相關資訊,發現cacti的微信告警的資訊着實很少,唯一看似可用的文章嘗試了下卻無法成功,在那篇文章的基礎上,我修改了一下微信腳本的代碼,測試成功了。故在此整理一下,供各位參看。
原理
由于cacti的thold插件本身并沒有微信告警功能,隻有郵件功能,是以本文章的微信告警功能其實是有取巧的性質。原理就是在thold插件觸發郵件告警的時候,同時運作微信發送消息的腳本,利用微信公衆号的api發送告警内容。
配置(cacti目錄為/usr/local/cacti)
1:安裝cacti的thold與settings插件。
thold依賴setting插件,先安裝settings插件:
插件下載下傳位址:http://docs.cacti.net/plugin:settings
1
2
<code># cp settings-v0.71-1.tgz /usr/local/cacti/plugins</code>
<code># tar -zxvf settings-v0.71-1.tgz</code>
安裝thold插件:
插件下載下傳位址:http://docs.cacti.net/plugin:thold
<code># cp thold-v0.5.0.tgz /usr/local/cacti/plugins</code>
<code># tar -zxvf thold-v0.5.0.tgz</code>
使插件生效:
3
4
5
6
7
8
9
10
11
12
<code># vi /usr/local/cacti/include/config.php </code>
<code>$database_type = </code><code>"mysql"</code><code>;</code>
<code>$database_default = </code><code>"cacti"</code><code>;</code>
<code>$database_hostname = </code><code>"localhost"</code><code>;</code>
<code>$database_username = </code><code>"cacti"</code><code>;</code>
<code>$database_password = </code><code>"cacti123456"</code><code>;</code>
<code>$database_port = </code><code>"3306"</code><code>;</code>
<code>$database_ssl = </code><code>false</code><code>;</code>
<code>#添加如下資訊</code>
<code>$plugins[] = </code><code>'settings'</code><code>;</code>
<code>$plugins[] = </code><code>'thold'</code><code>;</code>
進入cacti,在console--Configuration--Plugin Management中開啟插件即可。
<a href="https://s4.51cto.com/wyfs02/M02/99/8F/wKiom1lJ1CWwYLs4AABzBDw_P2I410.png" target="_blank"></a>
2:配置微信告警觸發與微信告警腳本
在thold插件程式中,觸發郵件告警的部分,添加運作微信告警的代碼。
13
14
15
16
17
18
19
20
21
22
23
24
<code># vi /usr/local/cacti/plugins/thold/thold_functions.php</code>
<code> </code><code>$message = str_replace(</code><code>'<GRAPH>'</code><code>, </code><code>"<br><img src='"</code> <code>. $val['</code><code>file</code><code>'] . "'</code><code>><br>Could not </code><code>open</code><code>!<br>" . $val[</code><code>'file'</code><code>], $message);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>########找到相關代碼位置,添加如下代碼__start##################### </code>
<code> </code><code>$msg_wx = strip_tags(str_replace(</code><code>'<br>'</code><code>, </code><code>"\n"</code><code>, $message)); </code><code>//</code><code>删除message中的html标簽,并将<br>替換為換行符\n</code>
<code> </code><code>$msg_wx = trim($msg_wx); </code><code>//</code><code>整理msg_wx字元串</code>
<code> </code><code>$msg_wx = iconv( </code><code>"GB2312//IGNORE"</code><code>, </code><code>"UTF-8"</code><code>, $msg_wx); </code><code>//</code><code>轉換編碼為utf-8,防止亂碼</code>
<code> </code><code>$sub_wx = iconv( </code><code>"GB2312//IGNORE"</code><code>, </code><code>"UTF-8"</code><code>, $subject); </code><code>//</code><code>轉換編碼為utf-8,防止亂碼</code>
<code> </code><code>$file_title = </code><code>'/tmp/title.txt'</code><code>; </code><code>//</code><code>要寫入檔案的檔案名(可以是任意檔案名),如果檔案不存在,将會建立一個</code>
<code> </code><code>$file_message = </code><code>'/tmp/message.txt'</code><code>; </code><code>//</code><code>要寫入檔案的檔案名(可以是任意檔案名),如果檔案不存在,将會建立一個</code>
<code> </code><code>if</code><code>($f = file_put_contents($file_title, $sub_wx)) </code><code>//</code><code>将subject參數的值儲存到file_title中</code>
<code> </code><code>if</code><code>($f = file_put_contents($file_message, $msg_wx)) </code><code>//</code><code>将msg_wx參數的值儲存到file_message中</code>
<code> </code><code>shell_exec(</code><code>"/etc/wechat.sh"</code><code>); </code><code>//</code><code>運作wechat.sh檔案,進行微信報警操作。</code>
<code> </code><code>#################end#################################</code>
<code> </code>
<code> </code><code>$text = array(</code><code>'text'</code> <code>=> </code><code>''</code><code>, </code><code>'html'</code> <code>=> </code><code>''</code><code>);</code>
<code> </code><code>if</code> <code>($filename == </code><code>''</code><code>) {</code>
<code> </code><code>$message = str_replace(</code><code>'<br>'</code><code>, </code><code>"\n"</code><code>, $message);</code>
<code> </code><code>$message = str_replace(</code><code>'<BR>'</code><code>, </code><code>"\n"</code><code>, $message);</code>
<code> </code><code>$message = str_replace(</code><code>'</BR>'</code><code>, </code><code>"\n"</code><code>, $message);</code>
<code> </code><code>$text[</code><code>'text'</code><code>] = strip_tags($message);</code>
觸發微信消息腳本:(提前申請微信企業号,并配置好相關資訊,可參考博文http://icenycmh.blog.51cto.com/4077647/1909527)
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<code># vi /etc/wechat.sh </code>
<code>#微信企業号的CropID</code>
<code>CropID=</code><code>'xxxxxxxxxxxxxxx'</code>
<code>#企業号中發送告警的應用</code>
<code>Secret=</code><code>'xxxxxxxxxxxxxxxxxxxxxxxxxxx'</code>
<code>GURL=</code><code>"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"</code>
<code>Gtoken=$(</code><code>/usr/bin/curl</code> <code>-s -G $GURL | </code><code>awk</code> <code>-F </code><code>"[\":,]"</code> <code>'{print $15}'</code><code>)</code>
<code>PURL=</code><code>"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"</code>
<code>function</code> <code>body() {</code>
<code>local</code> <code>int AppID=1</code>
<code>#Appid 填寫企業号中建立的報警APP的ID</code>
<code>local</code> <code>UserID=</code><code>"@all"</code>
<code>#此處填寫報警接收使用者,全部報警可留白</code>
<code>local</code> <code>PartyID=</code><code>"@all"</code>
<code>local</code> <code>TagID=</code><code>"@all"</code>
<code>Ent=$</code><code>'\n'</code>
<code>Date=$(</code><code>date</code> <code>'+%Y年%m月%d日 %H:%M:%S\n\n'</code><code>)</code>
<code>#應cactifans群内要求,添加Cacti微信報警日期參數</code>
<code>Tit=$(</code><code>cat</code> <code>/tmp/title</code><code>.txt)</code>
<code>#讀取/tmp/title檔案中内容到變量Tit</code>
<code>Msg=$Date$Tit$Ent$(</code><code>cat</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code> <code>'s/%//g'</code><code>)</code>
<code>#拼接msg主體檔案,包含日期,主題,報警内容.并删除報警内容中的'%'号.</code>
<code>Url=$(</code><code>grep</code> <code>"http"</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code> <code>'s/URL: //g'</code><code>)</code>
<code>#擷取message.txt中的url行内容</code>
<code>Pic_tmp=$(</code><code>grep</code> <code>"http"</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code> <code>'s/URL: //g'</code><code>|</code><code>sed</code> <code>'s/\/graph.php/\/graph_image.php/g'</code><code>)</code>
<code>if</code> <code>[ ! -n </code><code>"$Pic_tmp"</code> <code>] ;</code><code>then</code>
<code>Pic=</code><code>""</code>
<code>else</code>
<code>Pic=$Pic_tmp$</code><code>'&graph_height=130&graph_width=500&t='</code><code>$Date</code>
<code>fi</code>
<code>#根據url行内容修改為添加Pic參數</code>
<code>#另感謝cactifans群 深圳-動動 提供的方法,在此修改圖檔大小,防止圖像顯示不全,并判斷圖檔檔案是否存在。防止當機出現圖檔報警</code>
<code>printf</code> <code>'{\n'</code>
<code>printf</code> <code>'\t"touser": "'</code><code>"$UserID</code><code>"\""</code><code>,\n"</code>
<code>printf</code> <code>'\t"toparty": "'</code><code>"$PartyID</code><code>"\""</code><code>,\n"</code>
<code>printf</code> <code>'\t"totag": "'</code><code>"$TagID</code><code>"\""</code><code>,\n"</code>
<code>printf</code> <code>'\t"msgtype": "news",\n'</code>
<code>printf</code> <code>'\t"agentid": "'</code><code>" $AppID </code><code>"\""</code><code>,\n"</code>
<code>printf</code> <code>'\t"news": {\n'</code>
<code>printf</code> <code>'\t"articles": [\n'</code>
<code>printf</code> <code>'\t\t"title": "'</code><code>"$Tit</code><code>"\","</code><code>\n"</code>
<code>printf</code> <code>'\t\t"description": "'</code><code>"$Msg</code><code>"\","</code><code>\n"</code>
<code>printf</code> <code>'\t\t"url": "'</code><code>"$Url</code><code>"\","</code><code>\n"</code>
<code>printf</code> <code>'\t\t"picurl": "'</code><code>"$Pic</code><code>"\","</code><code>\n"</code>
<code>printf</code> <code>'\t}\n'</code>
<code>printf</code> <code>'\t]\n'</code>
<code>printf</code> <code>'}\n'</code>
<code>}</code>
<code>curl -l -H </code><code>"Content-type: application/json"</code> <code>-X POST -d </code><code>"$(body )"</code> <code>$PURL</code>
測試一下微信腳本是否可用:
<code>#在/tmp/title.txt和/tmp/message.txt中随便填寫一些内容,運作微信腳本:</code>
<code># echo 123 > /tmp/title.txt</code>
<code># echo 456 > /tmp/message.txt</code>
<code># sh /etc/wechat.sh</code>
如果收到微信資訊,則微信腳本可用,内容如下:
3:配置cacti郵件告警,并配置主機當機狀态告警:(不配置郵件應該也可以,隻是可以更直覺的發現觸發郵件告警的時候,同時觸發了微信告警)
配置郵件相關資訊與DNS:
模拟主機當機,檢視告警:
5:cacti流量監控告警配置
建立一個告警模闆,規定網口進入流量超過30M就觸發告警。(具體流量監控配置不在這裡闡述)
<a href="https://s4.51cto.com/wyfs02/M00/99/91/wKioL1lJ3BuSNzRTAAKQAr99Xos324.png" target="_blank"></a>
把這個模闆應用到某個主機端口上,如果流暢超過30M,則觸發告警,告警如下:
<a href="https://s5.51cto.com/wyfs02/M01/99/91/wKioL1lJ3QHSn32gAAKDLylKP58787.png" target="_blank"></a>
可以看到,不止能收到文本告警,就連當下接口的流量圖都可以收到,說明這個微信告警的功能還是挺強大滴~~~
注意:
如果流量告警中無法顯示流量圖,可以做如下修改:
<code>#取消cacti的圖像驗證配置</code>
<code># vi /usr/local/cacti/graph_image.php </code>
<code>#include("./include/auth.php"); #添加注釋</code>
<code>include_once(</code><code>"./lib/rrd.php"</code><code>);</code>
<code>include(</code><code>"./include/global.php"</code><code>); </code><code>#添加這一行</code>
本文轉自 icenycmh 51CTO部落格,原文連結:http://blog.51cto.com/icenycmh/1940443,如需轉載請自行聯系原作者