在生产环境中,往往使用邮件和短信来进行告警,由于邮件经常被忽略或当垃圾邮件清理掉,起不到告警的作用,而短信告警价格费用又比较高,而我们又经常使用及时通信软件像微信等等,利用微信告警可以大幅度的降低运维成本。具体的使用微信告警步骤,如下:


 (一)申请微信企业号。

(1)微信的第三方接口要求我们申请一个企业号来进行传送据,网站为:https://qy.weixin.qq.com/

。具体安装一步步来进行注册。

(2)在通讯录中添加组和成员:

   a,添加子部门,如图一

   b,添加成员,如图二

zabbix 企业微信告警 网络端口 告警通知 企业微信_python

  

图一

zabbix 企业微信告警 网络端口 告警通知 企业微信_zabbix 企业微信告警 网络端口_02

图二

注意:1,我们要把成员信息添加到组织部门,必须填写手机号+微信号+邮箱,这样别人扫码二维码才能正常的关注

    2,记住子部门的ID和成员的账号

 

 (3)在应用中心创建应用(单价+号-->消息性应用-->添加应用的名称,功能,应用范围)。创建应用,是因为通过应用发送消息给部门成员,一定要记住应用的ID。如下图:

zabbix 企业微信告警 网络端口 告警通知 企业微信_json_03


 (4)给部门设置管理员:

设置--->功能设置---->权限管理---->新建管理组 管理员必须事先已经关注了企业号,并且已经设置好邮箱地址

zabbix 企业微信告警 网络端口 告警通知 企业微信_企业号_04

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_05

注意:本次我们需要记住上次标红的部分,CorpID和Secret,这两个参数的值,在我们调用参数的时候要用到。


综上所述,我们需要提取如下信息:成员账号.组织部门的ID.应用ID.CorpID.Secret 


 

微信企业号接口调试工具传送门:http://qydev.weixin.qq.com/debug


zabbix 企业微信告警 网络端口 告警通知 企业微信_zabbix 企业微信告警 网络端口_06

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_07


(三)写shell脚本

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

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

   zabbix会传递三个参数给脚本,$1是消息接收账号,$2报警标题,$3报警内容

  


#!/bin/bash         


          ###send message from weixin for zabbix monitor          


          #author:lqb         


          #date:V1-2016-4-12         


                    


          CropID=          'xxxxxx'         


          Secret=          'xxxxxx'         


          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                                #企业号中的应用id         


                    local           UserID=$1                                 #部门成员id,zabbix中定义的微信接收者           


                    local           PartyID=2                                  #部门id,定义了范围,组内成员都可接收到消息         


                    local           Msg=$(          echo           "$@"           |           cut           -d          " "           -f3-)            #过滤出zabbix传递的第三个参数         


                    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'         


          }         


          /usr/bin/curl           --data-ascii           "$(body $1 $2 $3)"           $PURL



由于微信企业号开放的端口有固定的格式现在:

企业号支持的格式:http://qydev.weixin.qq.com/wiki/index.php?title=消息类型及数据格式

zabbix 企业微信告警 网络端口 告警通知 企业微信_json_08

(四)将脚本放到zabbix默认的执行路径下,并赋予可执行权限。



[root@zabbix alertscripts]          # mv weixin.sh /usr/local/zabbix/alertscripts/         


          [root@zabbix alertscripts]          # chown zabbix.zabbix weixin.sh            


          [root@zabbix alertscripts]          # chmod +x weixin.sh




(五)在zabbix服务器端进行如下设置。

  (1)创建媒介。管理-->示警媒体类型-->创建示警媒体类型-->类型选脚本.

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_09

  (2)创建用户

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_10

 (3)创建触发器动作发送的内容:

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_11

 (4)创建发送的方式。

zabbix 企业微信告警 网络端口 告警通知 企业微信_企业号_12


(六)收到的告警信息;

zabbix 企业微信告警 网络端口 告警通知 企业微信_json_13








python脚本为:         


          #!/usr/bin/env python          


          #coding: utf-8         


          import           time         


          import           urllib,urllib2         


          import           json         


          import           sys         


          ''          '         


          1 空         


          2 空         


          3 内容         


          ''          '         


          ""          "         


          touser否成员ID列表(消息接收者,多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向关注该企业应用的全部成员发送         


          toparty否部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为@all时忽略本参数         


          totag否标签ID列表,多个接收者用‘|’分隔。当touser为@all时忽略本参数         


          msgtype是消息类型,此时固定为:text         


          agentid是企业应用的          id          ,整型。可在应用的设置页面查看         


          content是消息内容         


          safe否表示是否是保密消息,0表示否,1表示是,默认0         


          ""          "         


          # baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'         


          # securl = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token         


          class WeChatMSG(object):         


                    def __init__(self,content):         


                    self.gettoken_url =           'https://qyapi.weixin.qq.com/cgi-bin/gettoken'              


                    self.gettoken_content = {         


                    'corpid'           :           'wxdc26c4d41cb90b70'          ,         


                    'corpsecret'           :           'D8Q-0d_6PKLhfJAST0BroOn2pgzb2BIVd0RUUNcu5HigsIXYppmApte1DiqQ1PFS'           ,                  


                    }         


                    self.main_content = {         


                    "toparty"          :          "1"          ,         


                    "agentid"          :          "3"          ,         


                    "msgtype"          :           "text"          ,         


                    "text"          :{         


                    "content"          :content,         


                    }         


                    }         


                    


                    def get_access_token(self,string):         


                    token_result = json.loads(string.          read          ())         


                    access_token=  token_result[          'access_token'          ]         


                    return           access_token.encode(          'utf-8'          )         


                    def geturl(self,url,data):         


                    data = self.encodeurl(data)         


                    response = urllib2.urlopen(          '%s?%s'           % (url,data))         


                    return           response.          read          ().decode(          'utf-8'          )         


                    


                    def posturl(self,url,data,isjson = True):         


                    if           isjson:         


                    data = json.dumps(data)         


                    response = urllib2.urlopen(url,data)         


                    return           response.          read          ().decode(          'utf-8'          )         


                    def encodeurl(self,dict):         


                    data =           ''         


                    for           k,          v           in           dict.items():         


                    data +=           '%s=%s%s'           % (k,          v          ,          '&'          )         


                    return           data         


          if           __name__ ==           '__main__'          :         


                    if           len(sys.argv) == 4:         


                    touser,notuse,content = sys.argv[1:]                 


                    else          :         


                    print           'error segments, now exit'         


                    sys.          exit          ()         


                    msgsender = WeChatMSG(content)         


                    access_token_response = msgsender.geturl(msgsender.gettoken_url, msgsender.gettoken_content)         


                    access_token =  json.loads(access_token_response)[          'access_token'          ]         


                    sendmsg_url =           'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'           % access_token           


                    print msgsender.posturl(sendmsg_url,msgsender.main_content)






注意:

由于2017年6月3号中午微信企业号升级到企业微信参考(https://work.weixin.qq.com/api/doc#10087):

微信插件 

企业号现已升级为企业微信,微信插件继承原企业号的所有能力。

管理员可在企业微信管理后台新建应用、群发通知,成员扫码关注微信插件后,即可在微信中接收企业通知和使用企业应用。原先的脚步暂时用不了,发不了微信,现在需要进行如下修改:

(一)申请企业微信号

(1)申请地址:work.weixin.qq.com/login。具体申请步骤省略:

(2)进入企业微信号创建企业应用,并把AgentId和Secret值记下来。

zabbix 企业微信告警 网络端口 告警通知 企业微信_zabbix 企业微信告警 网络端口_14

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_15

zabbix 企业微信告警 网络端口 告警通知 企业微信_python_16


(3)进入我的企业,记下来CorpID的值

zabbix 企业微信告警 网络端口 告警通知 企业微信_php_17


(4)编写微信的过滤脚步



#!/bin/bash          


           # SCRIPT_NAME:  weixin.sh          


           # DESCRIPTION:  send message from weixin for zabbix monitor          


           # DATE :        2017-06-07          


           CropID=           'XXXXX'          


           Secret=           'XXXXX'          


           #获取access_token          


           GURL=           "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"          


           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            Meg=$(           echo            "$@"            |            cut            -d           " "            -f3-)          


                      echo            ""           "{          


                      \"touser\" : \"@all\",          


                      \"msgtype\" : \"text\",             


                      \"agentid\" : XXXXX,          


                      \"text\" : {                     


                      \"content\" : \"$Meg\"}             


           }           ""           "          


           }          


           /usr/bin/curl            --data-ascii            "$(body $1 $2 $3)"            $PURL          


           /usr/bin/curl            --data-ascii            "$(body $1 $2 $3)"            $PURL >>            /tmp/weixin           .log





其他的和上边的一样。

不过特别要注意:zabbix3.0版本以上的,要添加变量,如下图,否则收不到信息的。

zabbix 企业微信告警 网络端口 告警通知 企业微信_zabbix 企业微信告警 网络端口_18





使用钉钉告警要先安装pip 具体参考:http://blog.51cto.com/liqingbiao/1749098。安装

pip install request

脚本为:



#!/usr/bin/python         


          import           requests         


          import           sys         


          import           json         


          import           datetime         


          import           os         


          corpid =           'ding5cbc5f3ec1c44e36'         


          corpsec =           'thHja9f9FmulSGJavsRWzE4gUm0LZN6075HufdjDHvazEe7K-3yka3hUUIZKjMGU'         


          r = requests.get(          'https://oapi.dingtalk.com/gettoken?corpid='          +corpid+          '&corpsecret='          +corpsec)         


          token = r.json()[          'access_token'          ]         


          data = {           "touser"           : sys.argv[1],         


                    "msgtype"          :          "text"          ,         


                    "agentid"          :          "120385392"          ,         


                    "text"          : {          "content"          : sys.argv[3]}                 


          }         


          print data         


          data = json.dumps(data)         


          headers = {          'content-type'          :           'application/json'          }         


          r = requests.post(          'https://oapi.dingtalk.com/message/send?access_token='          +token,data=data,headers=headers)         


          print r.status_code         


          ZBLOG =           open          (          '/tmp/newdingding.log'          ,          'a'          )         


          ZBLOG.write(str(datetime.datetime.now()))         


          ZBLOG.write(          '\n'          )         


          ZBLOG.write(str(sys.argv))         


          ZBLOG.write(          '\n'          )         


          ZBLOG.write(str(r.json()))         


          ZBLOG.write(          '\n'          )         


          ZBLOG.close()