Zabbix+微信企业号推送告警

因工作需要搜了一些监控解决方案,发现zabbix还是挺多人推荐的,于是乎记录一下学习过程。上篇使用grafana实现了数据可视化展示,可以通过web网页直观了解主机运行状况。为了及时了解到异常信息,可以使用zabbix的推送机制,实现告警信息的推送,


1.企业微信

详细教程网上自行搜索,我是参照这个教程,大体过程如下:

  • 注册企业微信,记录下ID,脚本调用API接口推送消息需要用到

  • 成员加入企业微信,关注微工作台

    INFO:企业微信是一个独立APP,微工作台是微信中原先的企业号(类似公众号),关注微工作台就可以用微信接收消息。

  • 通过通信录管理成员(可选)

  • 创建应用,记录下应用ID(AgentId)、应用安全码(Secret),脚本调用API接口推送消息需要用到

  • 设置应用可见范围(指定具体人员/部门可以使用应用)

    INFO:分配应用的使用权限给指定人员,这样相关人员就可以接收该应用的消息。


2.zabbix

2.1.准备脚本

  • 放置py脚本至zabbix的监控脚本目录,此处使用docker方式部署,已对脚本目录进行了映射(详细见docker-compose.yaml),所以只要拷贝至宿主机的/data/zabbix/alertscripts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# sendToWeixin.py
import requests
import json
import sys
import logging

# 企业号及应用相关信息
corp_id = 'xxx'
corp_secret = 'xxx'
agent_id = 'xxx'
# 存放access_token文件路径
token_path = '/tmp/access_token.log'
# 日志文件路径
log_path = '/tmp/send.log'
logging.basicConfig(level=logging.INFO,#控制台打印的日志级别
filename=log_path,
filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志;#a是追加模式,默认如果不写的话,就是追加模式
format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#日志格式
)

def get_access_token_from_file():
try:
f = open(token_path,'r+')
this_access_token = f.read()
logging.debug('get success %s' % this_access_token)
f.close()
return this_access_token
except Exception as e:
logging.debug(e)

# 获取token函数,文本里记录的token失效时调用
def get_access_token():
get_token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (corp_id, corp_secret)
logging.debug(get_token_url)
r = requests.get(get_token_url)
request_json = r.json()
this_access_token = request_json['access_token']
logging.debug(this_access_token)
r.close()
# 把获取到的access_token写入文本
try:
f = open(token_path,'w+')
f.write(this_access_token)
f.close()
except Exception as e:
logging.debug(e)

# 返回获取到的access_token值
return this_access_token

# snedMessage
retry = 2
while(retry>0):
retry -= 1
# 从文本获取access_token
access_token = get_access_token_from_file()
try:
to_user = '@all'
message = sys.argv[2]+'\n'+sys.argv[3]
inputArg = ' '.join(str(i) for i in sys.argv)
logging.debug('cmd: '+inputArg)

send_message_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
logging.debug(send_message_url)
message_params = {
"touser":to_user,
"msgtype":"text",
"agentid":agent_id,
"text":{
"content" : message
},
"safe":0
}
# markdown消息模板
# markdown_message = {
# "touser" : "@all",
# "msgtype": "markdown",
# "agentid" : agent_id,
# "markdown": {
# "content": "您的会议室已经预定,稍后会同步到`邮箱`\r\
# >**事项详情**\r\
# >事 项:<font color=\"info\">开会</font>\r\
# >组织者:@miglioguan\r\
# >参与者:@miglioguan、@kunliu、@jamdeezhou、@kanexiong、@kisonwang\r\
# >\r\
# >会议室:<font color=\"info\">广州TIT 1楼 301</font>\r\
# >日 期:<font color=\"warning\">2018年5月18日</font>\r\
# >时 间:<font color=\"comment\">上午9:00-11:00</font>\r\
# >\r\
# >请准时参加会议。\r\
# >\r\
# >如需修改会议信息,请点击:[修改会议信息](https://work.weixin.qq.com)"
# }
# }
# message_params = markdown_message
r = requests.post(send_message_url, data=json.dumps(message_params))
logging.debug('post success %s ' % r.text)
request_json = r.json()
errmsg = request_json['errmsg']
if errmsg == 'ok':
retry = 0
else:
access_token = get_access_token()
except Exception as e:
logging.error(e)

INFO:企业微信APP才支持markdown格式的消息。

  • 设置可执行权限
1
2
cd /data/zabbix/alertscripts # 脚本目录(宿主机)
chmod 755 sendToWeixin.py # 设置可执行权限

WARN:脚本有对文件读写操作,如果以root用户执行脚本测试,需将/tmp目录下的log文件删除,避免zabbix-server进程(zabbix用户)因权限问题执行失败。

  • zabbix-server安装运行环境
1
2
3
docker exec -it zabbix-server bash # 进入容器
apk add python3 # 安装python环境
pip3 install requests # 安装requests包

INFO:容器镜像是基于alpine的,没有带python环境,所以需要另外安装。

2.2.报警媒介

  • 创建报警媒介类型

INFO:使用了自定义脚本处理,传入参数使用了宏,对应后面用户关联报警媒介、动作中设置的信息。

  • 用户关联报警媒介,指定用户接收报警的类型、收报警的时段。

2.3.动作

动作是设定特定事件发生后触发的操作,比如触发器告警事件出现,发送消息通知特定人员。可以配置触发条件(例如特定的触发器)、消息模板、发送消息方式、发送目标。

INFO:更新操作的配置类似。

3.测试

停止监控主机上zabbix agent服务,5分钟之后zabbix server会出现告警,同时企业微信也收到告警消息。

4.小结

  • 要做精细化的通知,可以结合zabbix用户关联报警媒介所设置的收件人参数、修改脚本为通知相应企业微信用户来实现。
  • 后续可以通过zabbix的API接口,在企业微信应用中实现主动查询状态的功能。