目录



SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

前置条件:



1. 配置企业微信

Zabbix4.2.0使用Python连接企业微信报警 随笔 第1张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第2张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第3张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第4张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第5张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第6张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第7张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第8张



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] + '\n' + 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模板

Zabbix4.2.0使用Python连接企业微信报警 随笔 第9张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第10张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第11张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第12张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第13张



3.2 添加报警媒介

Zabbix4.2.0使用Python连接企业微信报警 随笔 第14张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第15张



3.3 配置到用户

Zabbix4.2.0使用Python连接企业微信报警 随笔 第16张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第17张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第18张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第19张



3.4 配置动作

Zabbix4.2.0使用Python连接企业微信报警 随笔 第20张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第21张

# 问题操作的标题:
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}

Zabbix4.2.0使用Python连接企业微信报警 随笔 第22张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第23张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第24张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第25张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第26张



4. 模拟故障测试



4.1 停止FTP并查看

[root@server ~]# systemctl stop vsftpd

Zabbix4.2.0使用Python连接企业微信报警 随笔 第27张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第28张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第29张



4.2 恢复FTP并查看

[root@server ~]# systemctl start vsftpd

Zabbix4.2.0使用Python连接企业微信报警 随笔 第30张
Zabbix4.2.0使用Python连接企业微信报警 随笔 第31张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄