zoukankan      html  css  js  c++  java
  • 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
    


  • 相关阅读:
    HDU 3401 Trade
    POJ 1151 Atlantis
    HDU 3415 Max Sum of MaxKsubsequence
    HDU 4234 Moving Points
    HDU 4258 Covered Walkway
    HDU 4391 Paint The Wall
    HDU 1199 Color the Ball
    HDU 4374 One hundred layer
    HDU 3507 Print Article
    GCC特性之__init修饰解析 kasalyn的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/liuhedong/p/10686842.html
Copyright © 2011-2022 走看看