• Zabbix4.2.0使用Python连接企业微信报警




    前置条件:



    1. 配置企业微信










    2. 脚本配置



    2.1 安装python依赖的库

    # 安装pip(python2或3版本都行,这里使用默认的python2进行配置)
    [root@server ~]# wget https://bootstrap.pypa.io/get-pip.py
    [root@server ~]# python get-pip.py
    [root@server ~]# pip install requests
    



    2.2 编写脚本

    将这个脚本写入到:vim /usr/lib/zabbix/alertscripts/wechat.py,并赋予执行权限chmod +x /usr/lib/zabbix/alertscripts/wechat.py,代码如下:

    #! /usr/bin/python
    # _*_ coding:utf-8 _*_
    
    """
    Name    : Liuhedong
    Date    : 2019/4/10 19:05
    Mail    : liuhedong135@163.com
    Version : Python 3.7.0
    IDE     : Pycharm-community-2018.2.4
    """
    
    # 若脚本失效,请联系博主。
    
    import requests
    import time
    import json
    import sys
    
    
    class Wechat(object):
    
        def __init__(self,overdue, tkpath, tktime, touser, toparty, corpid, corpsecret, agentid, content):
            # 消息接收者
            self.touser = touser
            # 部门ID列表
            self.toparty = toparty
            # token路径(首先从文件读取token,如果没有就get_token)
            self.tkpath = tkpath
            # 上次请求Token的时间存放的路径(时间戳)
            self.tktime = tktime
            # Token过期时间,期间内获取的Token是一样的
            self.overdue = overdue
            # 当前时间戳
            self.nowtime = int(time.time())
            # 企业ID
            self.corpid  = corpid
            # 管理组凭证
            self.corpsecret = corpsecret
            # 自建的程序管理ID
            self.agentid = agentid
            # 发送的内容
            self.content = content
            # 请求的AccessToken
            self.token = self.read_token()
    
        def read_token(self):
            try:
                self.token = str(open(self.tkpath,'r+').read())            # 读取token
                self.times = int(float(open(self.tktime,"r+").read()))     # 读取时间戳(需转换为整型)
                self.times = self.nowtime - self.times                     # 时间差(当前时间-上次时间)
                if self.times >= self.overdue:                             # 如果过期就重新请求Token(超过7200)
                    self.token = self.get_token()                          # 调用get_token方法重新获取
                    return self.token
                else:
                    return self.token       # 否则直接返回读取到token
            except IOError:
                self.token = self.get_token()                       # 如果读取失败证明没请求过(第一次请求)
                return self.token
        """
            该read_token方法的逻辑是:
            (1)读取token文件和times文件。如果出错代表是第一次运行此脚本(或被误删)
                1. 发起新的请求,获取token
                2. 最后返回请求到的token
            (2)读取token文件和time文件。没有错误就进行时间的相减
                1. 企业微信API在7200内请求的token是相同的。
                2. 企业微信API在1分钟内限制请求1000次。
                3. 将上次发起时间与现在时间相减,如果没有超过7200s就将之前存入的token返回
                4. 如果超过7200s则会发起新的请求,重新获取token
                5. 最后返回请求到的token
            注:在正常情况下,每次发送消息都会发起两次请求,获取token和发送消息到微信,所以此函数减少了获取token的频率。
        """
    
    
        def get_token(self):
            # 获取token的url
            url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}".format(self.corpid,self.corpsecret)
            # 发送get请求,并获取返回的内容
            token = requests.get(url).text
            # 将返回的内容(json)转为python字典格式,并获取token
            self.token = json.loads(token)['access_token']
            # 将获取到的token写入到本地文件
            with open(self.tkpath,'w+') as f:
                f.write(str(self.token))
            # 将当前时间的时间戳写入文件,以便下次计算过期时间
            with open(self.tktime,'w+') as f:
                f.write(str(time.time()))
            # 最后返回获取到的token
            return self.token
    
        def msg_send(self,content):
            # 发送消息的url
            url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(self.token)
            # 要发送的表单(需转换成json格式)
            data = {
                "touser": "|".join(self.touser),
                "toparty": self.toparty,
                "msgtype": "text",
                "agentid": self.agentid,
                "text": {
                    "content": content
                },
                "safe": 0
            }
    
            # 将python字典转化为json并指定编码utf-8(默认使用ascii编码)python3会出现编码问题,将#.encode('utf-8')的#注释删除掉即可。
            data_json = json.dumps(data, ensure_ascii=False)#.encode('utf-8')
            # 发送post请求,并发送表单,
            response = requests.post(url, data=data_json).text
            # 将返回的内容(json)转为python字典格式
            ss = json.loads(response)
            # 如果返回值不正确就打印发送失败,否则返回请求到的内容
            if ss['errcode'] != 0 and ss['errmsg'] != "ok":
                return "出现错误..."
            else:
                return response # 返回请求到的结果
    
    
    if __name__ == '__main__':
    
    
        # ======================用户配置信息区域==================================
    
        # token过期时间(过期后发起新的token请求)
        overdue = 7200
        # token保存的路径(详见read_token方法描述)
        tkpath = '/tmp/token'
        # 记录token过期时间的路径(详见read_token方法描述)
        tktime = '/tmp/tokentime'
        # 消息的接收者,"@all"表示向关注该企业应用的全部成员发送,多个用户逗号分隔
        # 注意:接收者必须在企业微信自建应用的可见范围内。否则消息接收不到!!!
        touser = ("ZongCai","LiuHeDong")
        # 部门ID列表,"@all"表示所有部门,多个部门|分隔,例如:1|2|3|4
        toparty = 1
        # 企业自建应用的ID(在zabbix中配置并传递过来)
        agentid = sys.argv[1]
        # 企业ID
        corpid = "********"
        # 自建应用的密钥
        corpsecret = "********"
        # 要发送的内容
        # sys.argv[1]是zabbix传来的应用ID
        # sys.argv[2]是zabbix传来的标题
        # sys.argv[3]是zabbix传来的内容
        # 若想修改为指定内容,修改content变量值即可
        content = sys.argv[2] + '
    ' + sys.argv[3]
    
        #======================================================================
    
        # 实例化微信类
        w = Wechat(
            overdue=overdue,
            tkpath=tkpath,
            tktime=tktime,
            touser=touser,
            toparty=toparty,
            corpid=corpid,
            corpsecret=corpsecret,
            agentid=agentid,
            content=content
        )
        # 调用微信实例中的发送消息方法
        w.msg_send(content)
    
    
    
    
    



    2. 搭建FTP

    # 这里我直接在zabbix服务器安装ftp
    [root@server ~]# yum install vsftpd
    listen=YES             # 修改为YES
    listen_ipv6=YES    # 删除这一条
    [root@server ~]# systemctl start vsftpd
    



    3. 配置Zabbix监控FTP



    3.1 添加FTP模板







    3.2 添加报警媒介




    3.3 配置到用户






    3.4 配置动作


    # 问题操作的标题:
    Problem:{TRIGGER.NAME}
    # 恢复操作的标题:
    Resolved: {TRIGGER.NAME}
    # 消息内容:
    Default subject:{TRIGGER.STATUS}: {TRIGGER.NAME}
     
    Trigger host:{HOSTNAME}
    Trigger ip:{HOST.IP}
    Trigger time:{EVENT.DATE}:{EVENT.TIME}
    Trigger: {TRIGGER.NAME}
    Trigger status: {TRIGGER.STATUS}
    Trigger severity: {TRIGGER.SEVERITY}
    Trigger URL: {TRIGGER.URL}
     
    Item values:
    {ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}
    {ITEM.NAME2} ({HOST.NAME2}:{ITEM.KEY2}): {ITEM.VALUE2}
     
    Original event ID: {EVENT.ID}
    







    4. 模拟故障测试



    4.1 停止FTP并查看

    [root@server ~]# systemctl stop vsftpd
    





    4.2 恢复FTP并查看

    [root@server ~]# systemctl start vsftpd
    


  • 相关阅读:
    java split
    百度知道
    2014年10月27日
    2014年10月27日
    mybatis批量update,返回行数为-1
    mybatis批量插入:oracle和mysql的区别
    oracle数据库,mybatis批量insert,缺失values字段
    java后台接收json数据,报错com.alibaba.fastjson.JSONObject cannot be cast to xxx
    C++——运算符重载(上)
    C++——友元
  • 原文地址:https://www.cnblogs.com/liuhedong/p/10686842.html
Copyright © 2020-2023  润新知