一、zabbix微信报警

第一步:申请企业微信号

传送门:https://qy.weixin.qq.com

  1. 添加通讯组并添加成员,记住部门ID:

zabbix微信报警(更新2017年6月)_第1张图片

2.添加应用加入可见成员,记住应用ID。注意需要上传LOGO

zabbix微信报警(更新2017年6月)_第2张图片

3.设置管理组权限,并记住CorpID Secret两个值,后面要用到

zabbix微信报警(更新2017年6月)_第3张图片

微信接口调试传送门:http://qydev.weixin.qq.com/debug

zabbix微信报警(更新2017年6月)_第4张图片

第二步:编写脚本

添加微信指定脚本路径:

vim /usr/local/zabbix/etc/zabbix_server.conf

AlertScriptsPath=/usr/local/zabbix/etc/alertscripts

创建目录必须是这个名字,在目录下创建wechat.sh脚本文件

使用:curl -s -G  url           获取 AccessToken

使用:curl --data  url     传送凭证调用企业号接口

mkdir -p /usr/local/zabbix/etc/alertscripts

vim wechat.sh

#!/bin/sh
#wechat zabbix baojing

CorpID=wxdc65a6980bf6     //公司的ID(corpid)
Secret=X3E6OmqpKXhzcntvnFrsmMRqr-MAgxesp9rLaVSOWrhqQP  //公司cercret(corpsecret)
GURL=" //获取AccessToken 
Gtoken=$(/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}')   //调用接口凭证AccessToken
PURL=" //调用接口发送消息 

function body() {     //使用函数定义json格式消息
local int AppID=1   //企业应用ID
local UserID=$1   //成员ID列表,多个以“|”分隔,经测试填写别的用户也可以发送消息,只是会有个无效用户提示
local PartyID=2  //部门ID定义
local Msg=$(echo "$@" | cut -d" " -f3-)  //获取发送消息内容
printf '{\n'
printf '\t"touser": "'"$UserID"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'"$AppID"\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}

#zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL

chown -R zabbix.zabbix /usr/local/zabbix/etc/alertscripts

chmod 750 /usr/local/zabbix/etc/alertscripts/wechat.sh


执行./wechat.sh 1 1 test 看自己微信是否能收到东西。

如果能的话,继续下一步。反之检查上面有什么问题

./wechat.sh 1 1 test

{"errcode":0,"errmsg":"ok"}

重启服务:

/etc/init.d/zabbix_server restart


第三步:登陆zabbix页面,配置触发器,媒介和动作

创建媒介wechat,类型为脚本:

注意:zabbix3.0后面要传三个参数

{ALERT.SECDTO}

{ALERT.SUBJECT}

{ALERT.MESSAGE}

zabbix微信报警(更新2017年6月)_第5张图片

zabbix微信报警(更新2017年6月)_第6张图片

创建用户,并将用户加入到管理组:

zabbix微信报警(更新2017年6月)_第7张图片

用户关联媒介为wechat,收件人为部门ID或用户:

zabbix微信报警(更新2017年6月)_第8张图片

调整用户权限为超级用户:

zabbix微信报警(更新2017年6月)_第9张图片

创建动作:

默认接收人:{TRIGGER.STATUS}

默认信息:

\n

主机:{HOSTNAME1}\n

地址:{HOST.IP}\n

时间:{EVENT.DATE}:{EVENT.TIME}\n

事件:{TRIGGER.NAME}\n

级别:{TRIGGER.SEVERITY}\n

项目:{TRIGGER.KEY1}\n

状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

恢复消息:

服务器:{HOSTNAME1}现在:{TRIGGER.STATUS}

\n

主机:{HOSTNAME1}\n

地址:{HOST.IP}\n

时间:{EVENT.DATE}:{EVENT.TIME}\n

事件:{TRIGGER.NAME}\n

级别:{TRIGGER.SEVERITY}\n

项目:{TRIGGER.KEY1}\n

状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

zabbix微信报警(更新2017年6月)_第10张图片

设置发送用户:

zabbix微信报警(更新2017年6月)_第11张图片

关闭被监控机,测试看能收到信息:

zabbix微信报警(更新2017年6月)_第12张图片


到此微信报警完成,附上python脚本:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib,urllib2,json
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
class WeChat(object):
        __token_id = ''
        # init attribute
        def __init__(self,url):
                self.__url = url.rstrip('/')
                self.__corpid = '企业ID'
                self.__secret = '企业sercret'
        # Get TokenID
        def authID(self):
                params = {'corpid':self.__corpid, 'corpsecret':self.__secret}
                data = urllib.urlencode(params)
                content = self.getToken(data)
                try:
                        self.__token_id = content['access_token']
                        # print content['access_token']
                except KeyError:
                        raise KeyError
        # Establish a connection
        def getToken(self,data,url_prefix='/'):
                url = self.__url + url_prefix + 'gettoken?'
                try:
                        response = urllib2.Request(url + data)
                except KeyError:
                        raise KeyError
                result = urllib2.urlopen(response)
                content = json.loads(result.read())
                return content
        # Get sendmessage url
        def postData(self,data,url_prefix='/'):
                url = self.__url + url_prefix + 'message/send?access_token=%s' % self.__token_id
                request = urllib2.Request(url,data)
                try:
                        result = urllib2.urlopen(request)
                except urllib2.HTTPError as e:
                        if hasattr(e,'reason'):
                                print 'reason',e.reason
                        elif hasattr(e,'code'):
                                print 'code',e.code
                        return 0
                else:
                        content = json.loads(result.read())
                        result.close()
                return content
        # send message
        def sendMessage(self,touser,message):
                self.authID()
                data = json.dumps({
                        'touser':touser,  //成员ID
                        'toparty':"2",   //部门ID
                        'msgtype':"text",  //固定消息类型为文本
                        'agentid':"1",   //应用ID
                        'text':{
                                'content':message   //消息内容
                        },
                        'safe':"0"
                },ensure_ascii=False)
                response = self.postData(data)
                print response
if __name__ == '__main__':
        a = WeChat('https://qyapi.weixin.qq.com/cgi-bin')
        a.sendMessage(sys.argv[1],sys.argv[3])