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,看能否发送微信消息
发表评论
共 0 条评论
暂无评论