因工作需要搜了一些监控解决方案,发现zabbix还是挺多人推荐的,于是乎记录一下学习过程。上篇使用grafana实现了数据可视化展示,可以通过web网页直观了解主机运行状况。为了及时了解到异常信息,可以使用zabbix的推送机制,实现告警信息的推送,
1.企业微信
详细教程网上自行搜索,我是参照这个教程,大体过程如下:
注册企业微信,记录下ID,脚本调用API接口推送消息需要用到
成员加入企业微信,关注微工作台
Tips
企业微信是一个独立APP,微工作台是微信中原先的企业号(类似公众号),关注微工作台就可以用微信接收消息。
通过通信录管理成员(可选)
创建应用,记录下应用ID(AgentId)、应用安全码(Secret),脚本调用API接口推送消息需要用到
设置应用可见范围(指定具体人员/部门可以使用应用)
Tips
分配应用的使用权限给指定人员,这样相关人员就可以接收该应用的消息。
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
import requests import json import sys import logging
corp_id = 'xxx' corp_secret = 'xxx' agent_id = 'xxx'
token_path = '/tmp/access_token.log'
log_path = '/tmp/send.log' logging.basicConfig(level=logging.INFO, filename=log_path, filemode='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)
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() try: f = open(token_path,'w+') f.write(this_access_token) f.close() except Exception as e: logging.debug(e)
return this_access_token
retry = 2 while(retry>0): retry -= 1 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 } 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)
|
markdown格式支持
企业微信APP才支持markdown格式的消息。
1 2
| cd /data/zabbix/alertscripts chmod 755 sendToWeixin.py
|
权限
脚本有对文件读写操作,如果以root用户执行脚本测试,需将/tmp目录下的log文件删除,避免zabbix-server进程(zabbix用户)因权限问题执行失败。
1 2 3
| docker exec -it zabbix-server bash apk add python3 pip3 install requests
|
python环境
容器镜像是基于alpine的,没有带python环境,所以需要另外安装。
2.2.报警媒介
Tips
使用了自定义脚本处理,传入参数使用了宏,对应后面用户关联报警媒介、动作中设置的信息。
- 用户关联报警媒介,指定用户接收报警的类型、收报警的时段。
2.3.动作
动作是设定特定事件发生后触发的操作,比如触发器告警事件出现,发送消息通知特定人员。可以配置触发条件(例如特定的触发器)、消息模板、发送消息方式、发送目标。
更新操作
更新操作由"提交评论、确认事件、状态变化、(手动地)关闭操作"触发,配置类似。
3.测试
停止监控主机上zabbix agent服务,5分钟之后zabbix server会出现告警,同时企业微信也收到告警消息。
4.小结
- 要做精细化的通知,可以结合zabbix用户关联报警媒介所设置的收件人参数、修改脚本为通知相应企业微信用户来实现。
- 后续可以通过zabbix的API接口,在企业微信应用中实现主动查询状态的功能。