一. 邮件通知
邮箱设置
开启邮件 SMTP 服务
在自己的QQ邮箱界面 找到设置 账户一栏
开启POP3/SMTP服务
获取授权码
授权码需要记录好,这个相当于一个验证的密码
报警媒介
报警媒介类型是一种给运维工程师发送消息通知的渠道,即当 zabbix 的触发器触发一个事件后,怎么才能把这个事件通过某些方式通知给运维工程师呢?
媒介类型就起到这样的作用,媒介类型创建好之后,需要在每个账户里面添加相应的收件配置,比如邮件类型的媒介类型要给 zabbix 账户添加邮箱,如果是微信类型的媒介类型那么就要在 zabbix 账户设置微信号,同样的到来,短信类型的媒介类型那就得给 zabbix 账户设置手机号用于接收报警消息内容。
管理–>报警媒介类型–>创建报警媒介类型:
创建报警媒介
给用户添加报警媒介
给该用户管理员权限
添加报警媒介
创建动作
动作是对 zabbix 触发器触发后生成的事件的具体处理操作,可以是远程执行命令,也可以是发送通知 指定的管理员进行故障处理,发送命令是调用的上一步骤创建好的报警媒介类型。
配置–>动作–>创建动作:
定义操作1:故障自治愈,自己执行脚本或者定义的命令
定义操作2:配置动作信息报警
配置故障恢复信息并添加动作
验证
root@Mysql-slave:~# /apps/nginx/sbin/nginx -s stop
root@Zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "net.tcp.listen[80]"
0
root@Zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "net.tcp.listen[80]"
0
root@Zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "net.tcp.listen[80]"
1
root@Zabbix-server:~# /apps/zabbix_server/bin/zabbix_get -s 172.20.32.105 -p10050 -k "net.tcp.listen[80]"
1
邮箱验证
二. 短信通知
通知脚本见 api 及通知脚本/send_sms_sh.sh
服务端配置略,不同厂商配置不一样
注册短信服务
云片
阿里大于
https://dysms.console.aliyun.com/
签名和模板
新增签名
签名用于显示在短信内容的最前面,显示这条短信来自哪家公司/产品/网站。运营商要求签名需经过审核。如下面的短信内容:
【阿里大于】: 你的验证码是XXXXX
“阿里大于”就是签名。
这里实例是云片
编写短信发送脚本
#!/bin/bash
# send_msg.sh
PHONE=$1
SUBJECT=$2
MESSAGE=$3
/usr/bin/curl -X "POST" "https://sms.yunpian.com/v2/sms/single_send.json" -H "content-type: application/x-www-form-urlencoded" -d "apikey=API-KEY" -d "mobile=${PHONE}" -d "text=${MESSAGE}"
#echo $? >> /tmp/A_zabbix_sms.txt
#echo $1 $3 >> /tmp/A_zabbix_sms.txt
#【alibaba】北京业务故障服务器:{HOST.NAME},IP:{HOSTNAME1},详情:{ITEM.NAME},{ITEM.VALUE}
root@Zabbix-server:~# /usr/bin/curl -X "POST" "https://sms.yunpian.com/v2/sms/single_send.json" -H "content-type: application/x-www-form-urlencoded" -d "apikey=API-KEY" -d "mobile=${PHONE}" -d "text=${MESSAGE}"
{"http_status_code":400,"code":-1,"msg":"非法的apikey","detail":"请检查您的apikey是否正确,或者账户已经失效"}
#是因为签名没有认证
root@Zabbix-server:~# /usr/bin/curl -X "POST" "https://sms.yunpian.com/v2/sms/single_send.json" -H "content-type: application/x-www-form-urlencoded" -d "apikey=25be5eb58affed3e2dee853da017390c" -d "mobile=${15675455220}" -d "text=北京业务故障服务器:172.20.32.101-mysql-server,IP:172.20.32.101#,详情:tcp.listen[80],0"
{"http_status_code":400,"code":-1,"msg":"非法的apikey","detail":"请检查您的apikey是否正确,或者账户已经失效"}
zabbix web 添加短信报警媒介
脚本参数是zabbix的宏定义自变量
https://www.zabbix.com/documentation/4.0/manual/appendix/macros/supported_by_location
创建短信通知动作
配置短信发送内容
配置恢复操作
测试短信告警通知
略
微信通知
注册企业微信
打开企业微信官网注册账号,使用自己的手机号进行注册。
https://work.weixin.qq.com/
创建一个 app 用于发送信息
红框信息使用 API 时需要用到,会自动生成AgentID和Secret
部门和人员信息配置
用户账户名称必须唯一,在发送微信报警信息的时候会调用
新增人员
账户名在整个公司中必须保持唯一
测试发送消息
手机上使用企业微信查看信息
只有上面的操作成功才表示在后面的步骤中能够正常的部署。
查看企业信息
企业 ID 在发送微信报警信息的时候会调用
zabbix server 配置
zabbix server 实现微信通知基于 python 调用脚本实现且需要使用 pip 安装
requests 模块:
root@Zabbix-server:~# apt install python-pip
root@Zabbix-server:~# pip install requests
先获取 token,token 是通过 corpid(企业 ID)和 corpsecret(应用 Secret)获取到的,然后通过 API 发送消息,根据官方文档可以看到,发送的消息其实就是一个 post 请求,请求方式如下:
请求方式:POST(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send?
access_token=ACCESS_TOKEN
post 参数为 access_token 和 消息体。
编写 python 程序
在 zabbix server 安装基础模块并编写 pyhton 脚本,python 脚本通过调用企业微信的 API 实现自动发送通知消息:
测试获取 token
此处需要使用corpid和corpsecret,就是下图红框中的内容:
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# pwd
/apps/zabbix_server/share/zabbix/alertscripts
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# which python3
/usr/bin/python3
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# vim get_token.py
#!/usr/bin/python3
import requests
corpid = "你公司的ID"
corpsecret = "你的app的corpsecret"
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + \
"&corpsecret=" + corpsecret
token = requests.get(url)
values = list(token.json().values())
print(values[2])
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# python3 get_token.py
2k1Uoee0-k_7Mt3f-zW2ald1gxGZnvYTHPuEwVLNtQChGHOU_f40XjGbIvp5-DGXkckm4hvNXcCJl00126fYQocz0JvdUGRTrexJSJklTTG1D_-dttoMICxpLYvfk9u-eB-VK1k9-Vhbusr3k_S1oY520Zb1A9ulXkDnUt_LmSTTU-gEm1HUTeckdiBKDNrDEcBmXdxRT2pchXQqzAiDig
#获取到可token,可以使用该token调用API发信息了。
py脚本
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# cat sent_wechat_msg.py
#!/usr/bin/python3
# Edited by likai.tech on 2020.05.04
#
import os
import sys
import json
import logging
import requests as req
corpid = "wwf732e03dce6f50ba"
corpsecret = "Zb_0J5zlCyfGFXAb3RUCGjkKpod0W-21OZgSFx4T_fY"
agentid = "1000013"
token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + \
"&corpsecret=" + corpsecret
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
datefmt="%a, %d %b %Y %H:%M:%S",
filename=os.path.join("/tmp", "wx_message.log"),
filemode='a')
def get_token(url):
r = req.get(url)
token_value = list(r.json().values())[2]
return token_value
token = get_token(token_url)
msg_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + token
msg_to = sys.argv[1]
subject = sys.argv[2]
msg_body = sys.argv[2] + "\n\n" +sys.argv[3]
#消息发送的必要信息改为获取命令行的参数,以便在 zabbix使用宏来代替消息内容等信息。
post_body = {
"touser": msg_to,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": msg_body
},
"safe": 0
}
def send_msg(url, p_body):
post = req.post(msg_url, data=json.dumps(p_body))
send_msg(msg_url, post_body)
logging.info('msg_to:' + msg_to + ';;suject:' + subject + ';;msg:' + msg_body)
py脚本测试
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# chmod a+x sent_wechat_msg.py
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# python3 sent_wechat_msg.py "LiKai" "one a test for zabbix" "run run run!"
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# cat /tmp/wx_message.log
Mon, 04 May 2020 03:45:48:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): qyapi.weixin.qq.com
Mon, 04 May 2020 03:45:49:DEBUG:urllib3.connectionpool:https://qyapi.weixin.qq.com:443 "GET /cgi-bin/gettoken?corpid=wwf732e03dce6f50bc&corpsecret=Zb_0J5zlCyfGFXAb3RUCGjkKpod0W-21OZgSFx4T_eY HTTP/1.1" 200 277
Mon, 04 May 2020 03:45:49:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): qyapi.weixin.qq.com
Mon, 04 May 2020 03:45:49:DEBUG:urllib3.connectionpool:https://qyapi.weixin.qq.com:443 "POST /cgi-bin/message/send?access_token=2k1Uoee0-k_7Mt3f-zW2ald1gxGZnvYTHPuEwVLNtQChGHOU_f40XjGbIvp5-DGXkckm4hvNXcCJl00126fYQocz0JvdUGRTrexJSJklTTG1D_-dttoMICxpLYvfk9u-eB-VK1k9-Vhbusr3k_S1oY520Zb1A9ulXkDnUt_LmSTTU-gEm1HUTeckdiBKDNrDEcBmXdxRT2pchXQqzAiDig HTTP/1.1" 200 44
Mon, 04 May 2020 03:45:49:INFO:root:msg_to:LiKai;;suject:one a test for zabbix;;msg:one a test for zabbix
run run run! # # 日志记录了详细信息
添加微信报警媒介
下图中Script parameters表示 zabbix 的宏,zabbix 会在调用该 python程序时,使用图中的三个宏的内容分别填充到三个命令行参数中,实现将告警信息发送给企业微信用户。
添加报警动作
定义消息内容细节和收件人及发送方式
添加操作
恢复操作
最终界面
最终测试告警信息
这里注意的是python脚本放置的位置
root@Zabbix-server:~# ll /apps/zabbix_server/share/zabbix/alertscripts/sent_wechat_msg.py
这里停止172.20.32.105的nginx服务
root@Mysql-slave:~# /apps/nginx/sbin/nginx -s stop
root@Zabbix-server:/apps/zabbix_server/share/zabbix/alertscripts# tail /tmp/wx_message.log
Mon, 04 May 2020 05:05:12:DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): qyapi.weixin.qq.com
Mon, 04 May 2020 05:05:12:DEBUG:urllib3.connectionpool:https://qyapi.weixin.qq.com:443 "POST /cgi-
bin/message/send?access_token=2k1Uoee0-k_7Mt3f-
zW2ald1gxGZnvYTHPuEwVLNtQChGHOU_f40XjGbIvp5-
DGXkckm4hvNXcCJl00126fYQocz0JvdUGRTrexJSJklTTG1D_-dttoMICxpLYvfk9u-eB-VK1k9-
Vhbusr3k_S1oY520Zb1A9ulXkDnUt_LmSTTU-gEm1HUTeckdiBKDNrDEcBmXdxRT2pchXQqzAiDig
HTTP/1.1" 200 44
Mon, 04 May 2020 05:05:12:INFO:root:msg_to:LiKai;;suject:问题已解决: nginx-80-trigger;;msg:问题已解决: nginx-80-trigger
解决问题时间 05:05:03 on 2020.05.04
Problem name: nginx-80-trigger
Host: 172.20.32.105-mysql-slave
Severity: High
Original problem ID: 1378
kaivi 恢复操纵标识