一、关键词:
cacti、微信告警
二、摘要:
在现实生产环境中,由于短信接收告警实现起来需要money,对企业来说也是一笔可以省下的支出,所以大部分公司会选择采用邮件告警和微信推送告警。由于微信提供了第三方API接口,所以利用微信告警可以实现降低运维成本。
三、实现过程:
1、企业微信配置过程
(1)申请企业微信公众号,官方网址:https://qy.weixin.qq.com/
image.png
(2)邮箱收到验证邮件以后点击链接激活账号
(3)选择类型为企业号,群发消息无限制
(4)主体类型选企业和团队均可以,建议选择团队,减少认证
(5)登陆微信后台管理平台https://work.weixin.qq.com。通讯录中增加成员,新建部门,此处略
(6)创建应用(创建成功后会在自建应用里能看到刚才自己创建的应用)
image.png
image.png
(7)设置可见范围(注意:此处应用ID和secret要用记事本记下来,稍后会在cacti的微信脚本中使用)
image.png
(8)验证企业微信公众号发送消息功能
点击API文档(学习API开发教程(企业微信所有的配置详解这里都有))
image.png
image.png
获取access_token(此处填写企业ID和secret),注意:access_token会一段时间内可用
image.png
找到对应的部门ID,应用ID,access_token验证发送消息
image.png
此时查看企业微信,会收到相应的测试信息
*总结:
企业微信主要获取如下数据:
#企业ID
#secret
#部门ID
#应用ID
2、cacti设置
(1)修改cacti中thold报警内容输出至文本
[root@CactiEZ ~]# vim /var/www/html/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文件,进行微信报警操作
$text = array('text' => '', 'html' => ''); #此语句原来有,不用加
(2)创建微信发送脚本
[root@CactiEZ ~]# vim /etc/wechat.sh
#微信企业号发送消息脚本
#!/bin/bash
CropID='**********' #此处CropID请根据实际情况填写
Secret='*****************' #此处Secret请根据实际情况填写
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
#此处语句获取access_token,随着时间变化,可能会有变化,需要按现实实际情况修改此语句才能获得
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body()
{
local int AppID=**********
#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内容可参考官方文档接口中发送消息中消息类型以及数据格式进行修改
image.png