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







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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM