随心一记

一二三四五,上山打老鼠


  • 首页

  • 归档

  • 标签
ywcsb

ywcsb

游戏可以不玩,小说不能不看。

153 日志
3 分类
42 标签
RSS
GitHub 知乎 随心一记
Links
  • 随心一记
  • 追梦人物的
  • MSDN

Zabbix使用微信发送告警

发表于 2021-09-08 | 阅读 1027 | 分类于 系统运维 |
  • 一、注册企业微信
    • 1. 注册地址:注册地址
    • 2. 注册成功后,进入后台管理
    • 3. 添加一个部门,并记住部门 ID
    • 4. 添加一个用户到上面创建的部门里面(这里采取直接将管理员添加进去)
    • 5. 创建一个自建应用
    • 6. 创建完成记住 AgentID 、Secret和企业ID
  • 二、 zabbix-server 配置
    • 1. 编辑zabbix-server 配置文件进行配置(yum安装的,路径为/etc/zabbix/)
    • 2. 安装 python requests库
    • 3. zabbix报警脚本
    • 4. 测试脚本是否可用
  • 三、server 端Web界面配置
    • 1. 进入:配置 -> 报警媒介类型 -> 创建媒体类型
    • 2. 报警消息配置
    • 3. 给用户添加报警媒介,也可以新建一个用户用来专门来用于微信报警,我这里直接使用 admin 用户了(说明:这里收件人对应企业微信号中的应用ID)
      • 4. 测试

Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警的及时处理。

一、注册企业微信

1. 注册地址:注册地址

2. 注册成功后,进入后台管理

进入后台管理

3. 添加一个部门,并记住部门 ID

4. 添加一个用户到上面创建的部门里面(这里采取直接将管理员添加进去)

5. 创建一个自建应用

6. 创建完成记住 AgentID 、Secret和企业ID

到这里上面的企业微信注册就完成了,记住上面所提到需要记住的。

二、 zabbix-server 配置

1. 编辑zabbix-server 配置文件进行配置(yum安装的,路径为/etc/zabbix/)

# vim /usr/local/zabbix/etc/zabbix_server.conf
AlertScriptsPath=/usr/local/zabbix/lib/zabbix/alertscripts     //(如果不存在则自动创建)
# mkdir -p /usr/local/zabbix/lib/zabbix/alertscripts

2. 安装 python requests库

# pip3 install requests

3. zabbix报警脚本

# vim /usr/local/zabbix/lib/zabbix/alertscripts/wechat.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2021/9/1 2:39 下午
# @Author : 
# @Site :
# @File : wechat.py
# @Software: PyCharm
import os
import logging
import requests
import json
import sys

path = os.path.split(os.path.realpath(__file__))[0]
logger = logging.getLogger()
file_hand = logging.FileHandler(os.path.join(path, 'weixin.log'), encoding='utf-8')  # 创建一个文件管理操作符
screen_hand = logging.StreamHandler()  # 创建一个屏幕管理操作符
format1 = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')  # 创建一个日志输出的格式
file_hand.setFormatter(format1)  # 文件管理操作符 绑定一个 格式
screen_hand.setFormatter(format1)  # 屏幕管理操作符 绑定一个 格式
logger.addHandler(file_hand)  # logger对象 绑定 文件管理操作符
logger.addHandler(screen_hand)  # logger对象 绑定 屏幕管理操作符
logger.setLevel(logging.DEBUG)  # 设置logger级别


class WeiXin:
    def __init__(self):
        self.key = {
            'corpid': 'XXXXXXXX',  # 刚刚记住的企业ID
            'corpsecret': 'XXXXXXXX'  # 刚刚记住的 企业Secret

        }
        self.api_url = 'https://qyapi.weixin.qq.com/cgi-bin/'
        self.headers = {'content-type': 'application/json'}
        self.touser = '@all'
        self.toparty = 2
        self.agentid = '1000002'  # 刚刚记住的AgentID

    def http_request(self, url, method, **kwargs):
        headers = {'content-type': 'application/json'}
        url = self.api_url + url

        if method == 'GET':
            try:
                request = requests.Session()
                response = request.get(url, headers=headers, **kwargs, timeout=28)
            except requests.exceptions.ConnectionError as f:
                logger.error(f'{f}')
            else:
                logger.info(f'获取gettoken{response.json()}')
                return response.json()
        elif method == 'POST':
            try:
                response = requests.post(url, headers=headers, **kwargs, timeout=28)
            except requests.exceptions.ConnectionError as f:
                logger.error(f'{f}')
                return False
            else:
                logger.info(f'发布信息:{response.json()}')
                return response

    def get_access_token(self):
        response = self.http_request('gettoken', 'GET', params=self.key)
        if response and response['errcode'] == 0:
            logger.info(f'获取微信token:{response["access_token"]}')
            return response['access_token']
        logger.error(f'获取token出现错误:{response.json()}')
        return 'Failed.'

    def sed_message(self, subject, message):
        """https://open.work.weixin.qq.com/api/doc/90000/90135/90236"""
        data = {
            'touser': self.touser,  # 指定接收消息的成员,成员ID列表(多个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为”@all”,则向该企业应用的全部成员发送
            'msgtype': 'text',
            'toparty': self.toparty,  # 指定接收消息的部门,部门ID列表,多个接收者用‘|’分隔,最多支持100个。当touser为”@all”时忽略本参数
            'agentid': self.agentid,  # 企业应用的id,整型。企业内部开发,可在应用的设置页面查看;第三方服务商,可通过接口 获取企业授权信息 获取该参数值
            'text': {
                # 消息内容,最长不超过2048个字节,超过将截断(支持id转译)
                'content': f"%s\n %s" % (subject, message.replace('\r', '\n'))
            },
            "safe": 0
        }
        data = json.dumps(data, ensure_ascii=False)
        logger.info(f'{data}')
        response = self.http_request(f'message/send?access_token={self.get_access_token()}', 'POST',
                                     data=data.encode('utf-8'))
        return response.json()


if __name__ == '__main__':

    logging.info('程序开始')
    try:
        SENDTO = sys.argv[1]
        SUBJECT = sys.argv[2]
        MESSAGE = sys.argv[3]
        logging.info(f'发送用户:{SENDTO}')
        logger.info(f'发送标题:{SUBJECT}')
        logger.info(f'发送内容:{MESSAGE}')
        # with open('weixin_err.log', 'a+') as f:
        #     f.write(f'{SENDTO}\n{SUBJECT}\n{MESSAGE}\n')
    except IndexError as e:
        logger.error(f'{e}')
        # with open('weixin_err.log', 'a+') as f:
        #     f.write(f'{str(e)}\n')
    else:
        win_xin = WeiXin()
        the = win_xin.sed_message(SUBJECT, MESSAGE)
        logger.info(f'{the}')

4. 测试脚本是否可用

# python3 /usr/local/zabbix/lib/zabbix/alertscripts/wechat.py www web 123
{u'invaliduser': u'', u'errcode': 0, u'errmsg': u'ok'}

三、server 端Web界面配置

1. 进入:配置 -> 报警媒介类型 -> 创建媒体类型

脚本参数

{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}

2. 报警消息配置

  • 操作:
故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
  • 恢复
恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

3. 给用户添加报警媒介,也可以新建一个用户用来专门来用于微信报警,我这里直接使用 admin 用户了(说明:这里收件人对应企业微信号中的应用ID)

4. 测试

停掉一个agent,看能否发送微信消息

觉得不错,支持一下!
geerniya WeChat Pay

微信打赏

geerniya Alipay

支付宝打赏

网络工具使用MTR
tomcat出现:Initializing connection provider/ org.springframework.orm.hibernate3.LocalDataSourceConnect

发表评论

共 0 条评论

    暂无评论
© 2018 - 2022 ywcsb
冀ICP备17022045号-1
Supported by 腾讯云