使用python脚本将zabbix报警推送至企业微信

一、申请企业微信号

注册地址:https://work.weixin.qq.com

使用python脚本将zabbix报警推送至企业微信_第1张图片
使用python脚本将zabbix报警推送至企业微信_第2张图片

使用python脚本将zabbix报警推送至企业微信_第3张图片
使用python脚本将zabbix报警推送至企业微信_第4张图片
使用python脚本将zabbix报警推送至企业微信_第5张图片
使用python脚本将zabbix报警推送至企业微信_第6张图片
二、创建应用

使用python脚本将zabbix报警推送至企业微信_第7张图片
使用python脚本将zabbix报警推送至企业微信_第8张图片
使用python脚本将zabbix报警推送至企业微信_第9张图片

这里测试下API链接,将刚刚的AgentdId 和Secret输入进下面网址测试:https://work.weixin.qq.com/api/devtools/devtool.php

使用python脚本将zabbix报警推送至企业微信_第10张图片
四、Zabbix-Server端配置

  • 下载依赖工具
wget https://pypi.python.org/packages/f0/07/26b519e6ebb03c2a74989f7571e6ae6b82e9d7d81b8de6fcdbfc643c7b58/simplejson-3.8.2.tar.gz
tar zxf simplejson-3.8.2.tar.gz
python setup.py build
python setup.py install
  • 查看zabbix-server中默认脚本路径
[root@localhost ~]# grep alertscripts /etc/zabbix/zabbix_server.conf
# AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
[root@localhost ~]# cd /usr/lib/zabbix/alertscripts    #切换至zabbix-server默认脚本文件夹中

五、编写脚本

这里有三种脚本,第一种是shell脚本,第二种是python脚本,第三种是python3.5版本以上的脚本

  • 第一种shell脚本:
[root@localhost alertscripts]# vim wechat.sh    #在zabbix-server默认脚本路径下新建一个wechat.sh脚本
#!/bin/bash
###SCRIPT_NAME:weixin.sh###
###send message from weixin for zabbix monitor###
###wuhf###
###V1-2019-06-18###
CropID='wwe749f****'    #企业ID
Secret='iNK-u8DyNFOapqBvt3eYGOTyCKF4-0bKyOFof******'      #应用中的Secret
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 int AppID=1000003 #企业号中的应用id
local UserID=LiuYong #部门成员id,zabbix中定义的微信接收者
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'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL

  • 第二种python脚本
[root@localhost alertscripts]# vim wechat.py    #在zabbix-server默认脚本路径下新建一个wechat.py脚本
#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
import requests,sys,json
import urllib3
urllib3.disable_warnings()
reload(sys)
sys.setdefaultencoding('utf-8')
def GetToken(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    Token = r.json()['access_token']
    return Token
def SendMessage(Token,User,Agentid,Subject,Content):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    Data = {
        "touser": User,                # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
        #"totag": Tagid,               # 企业号中的部门id,群发时使用。
        "msgtype": "text",             # 消息类型。
        "agentid": Agentid,            # 企业号中的应用id。
        "text": {
            "content": Subject + '\n' + Content
        },
        "safe": "0"
    }
    r = requests.post(url=Url,data=json.dumps(Data),verify=False)
    return r.text
if __name__ == '__main__':
    User = sys.argv[1]                  # zabbix传过来的第一个参数
    Subject = sys.argv[2]               # zabbix传过来的第二个参数
    Content = sys.argv[3]               # zabbix传过来的第三个参数
    Corpid = "wwe749f2********"            # CorpID是企业号的标识
    Secret = "iNK-u8DyN***************"     # Secret是管理组凭证密钥
    #Tagid = "2"                        # 通讯录标签ID
    User = "LiuYong"                    #指定用户名
    Agentid = "1000003"                  # 应用ID
    Token = GetToken(Corpid, Secret)
    Status = SendMessage(Token,User,Agentid,Subject,Content)
    print Status
  • 第三种python3.5版本以上
[root@localhost alertscripts]# vim wechat.py    #在zabbix-server默认脚本路径下新建一个wechat.py脚本
#!/usr/local/bin/python3.5
#coding:utf-8
import requests,sys,json
import urllib3
import sys
import imp
import importlib
importlib.reload(sys)
urllib3.disable_warnings()
def GetToken(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    Token = r.json()['access_token']
    return Token
def SendMessage(Token,User,Agentid,Subject,Content):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    Data = {
        "touser": User,                # 企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
        "totag": Tagid,                 # 企业号中的部门id,群发时使用。
        "msgtype": "text",               # 消息类型。
        "agentid": Agentid,              # 企业号中的应用id。
        "text": {
            "content": Subject + '\n' + Content
        },
        "safe": "0"
    }
    r = requests.post(url=Url,data=json.dumps(Data),verify=False)
    return r.text
if __name__ == '__main__':
    User = sys.argv[1]                          # zabbix传过来的第一个参数
    Subject = sys.argv[2]                       # zabbix传过来的第二个参数
    Content = sys.argv[3]                       # zabbix传过来的第三个参数
    Corpid = "wwe749f2********"             # CorpID是企业号的标识
    Secret = "iNK-u8DyN***************"     # Secret是管理组凭证密钥
    Tagid = "2"                            # 通讯录标签ID
    User = "LiuYong"                       #指定用户名
    Agentid = "1000003"                    # 应用ID
    Token = GetToken(Corpid, Secret)
    Status = SendMessage(Token,User,Agentid,Subject,Content)
    print (Status)
  • 脚本说明:
    1.corpid、appsecret、agentid就是我们需要从企业号和应用中获取到的信息,其中.corpid、appsecret用于获取accesstoken,agentid用于往应用发送消息
    2.由于zabbix会往脚本中传入3个参数,分别为sendto(收件人)、subject(报警主题)、message(报警信息)。这3个参数需要在zabbix中配置,我们下面会讲到。

    此脚本中我们没有接受subject参数,而是直接使用sendto及message参数。
    另经测试添加toparty部门变量后,发现报警信息会重复发送,因此在此注释掉。
    具体的报警发送信息,我们通过脚本打印在日志weixin.log中

  • 授予相关权限
    由于我的系统python版本是2.7,所以这里我使用了第二种脚本,创建wechat.py

chmod +x wechat.py    #给新建脚本授予权限
touch weixin.log    #创建日志
chown zabbix.zabbix weixin.log   #将日志添加zabbix组
  • 脚本测试
[root@localhost alertscripts]# ./wechat.py 2 报警测试 error

使用python脚本将zabbix报警推送至企业微信_第11张图片
以下就是脚本运行成功
使用python脚本将zabbix报警推送至企业微信_第12张图片

六、Zabbix前段对接企业微信服务

  1. 添加报警媒介使用python脚本将zabbix报警推送至企业微信_第13张图片

使用python脚本将zabbix报警推送至企业微信_第14张图片
参数:

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
  1. 添加用户
    这里最主要的是收件人,写@all则为全部都发,写部门ID则以部门为ID去群发。写用户账号则为账号去发
    使用python脚本将zabbix报警推送至企业微信_第15张图片
    使用python脚本将zabbix报警推送至企业微信_第16张图片
    使用python脚本将zabbix报警推送至企业微信_第17张图片
    使用python脚本将zabbix报警推送至企业微信_第18张图片

  2. 添加动作
    使用python脚本将zabbix报警推送至企业微信_第19张图片
    使用python脚本将zabbix报警推送至企业微信_第20张图片
    操作中的
    默认标题:
    服务器:{HOST.NAME}出现故障!\n

    消息内容:
    告警主机:{HOSTNAME1}
    主机地址:{HOST.IP}
    告警时间:{EVENT.DATE} {EVENT.TIME}
    监控项目:{ITEM.NAME}
    监控取值:{ITEM.LASTVALUE}
    告警等级:{TRIGGER.SEVERITY}
    告警信息:{TRIGGER.NAME}
    问题详情:{ITEM.NAME}:{ITEM.VALUE}
    当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
    事件ID:{EVENT.ID}

使用python脚本将zabbix报警推送至企业微信_第21张图片

恢复操作中:
默认标题:
服务器:{HOST.NAME}已恢复!\n
消息内容
恢复主机:{HOSTNAME1}
主机地址:{HOST.IP}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
持续时间:{EVENT.AGE}
故障信息:{TRIGGER.NAME}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

使用python脚本将zabbix报警推送至企业微信_第22张图片
到此zabbix企业微信报警完成,测试是否有效:
我通过更改模板中CPU使用率触发值(大于0则报警告)来测试

使用python脚本将zabbix报警推送至企业微信_第23张图片
将CPU使用率值调回原来的值
使用python脚本将zabbix报警推送至企业微信_第24张图片

这里测试成功!

你可能感兴趣的:(zabbix,zabbix)