zabbix 6.0结合邮箱进行告警

1、邮箱告警流程

  1. 个人邮箱/企业邮箱

  2. 开启邮箱 smtp功能,获取授权码

  3. 发件人:配置zabbix服务端报警媒介

  4. 收件人:配置群组、用户接收报警

  5. 报警动作:什么时候发送告警邮件

2、准备邮箱

QQ邮箱地址:https://mail.qq.com/

img

img

1
**什么是授权码?**

授权码是QQ邮箱用于登录第三方客户端/服务的专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务。
温馨提醒:为了你的帐户安全,请不要告诉他人你的授权码,更改QQ帐号密码会触发授权码过期,需要重新获取新的授权码登录。

3、测试邮箱使用连接正常

1
2
3
4
5
6
# 安装网络测试连接工具
[root@zabbix-server01 ~]# yum install -y nc

# 测试邮箱
[root@zabbix-server01 ~]# nc smtp.qq.com -t 25
220 newxmesmtplogicsvrsza29-0.qq.com XMail Esmtp QQ Mail Server.

4、设置zabbix 连接邮箱信息

img

img

img

img

img

img

img

4.1 设定宏

img

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
信息类型是: 问题( 发生故障 ) 
主题: 故障名称: {EVENT.NAME}
消息:
故障始于 时间: {EVENT.TIME} 日期: {EVENT.DATE}
故障名称: {EVENT.NAME}
故障主机: {HOST.NAME}
严重程度: {EVENT.SEVERITY}
额外信息: {EVENT.OPDATA}
故障ID: {EVENT.ID}
---
发器地址: {TRIGGER.URL}
#信息类型是: Problem recov 故障解决的时候
主题: 故障解决 in {EVENT.DURATION}: {EVENT.NAME}
消息:
故障已经解决 时间: {EVENT.RECOVERY.TIME} 日期:
{EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障持续时间: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}

5、设置用户组和用户

5.1 创建用户组

针对不同的告警,发送至不同的用户组。

img

img

img

5.2 创建用户

img

img

设置用户的告警媒介

img

用户配置权限

img

查看新增用户

img

5.3 赋予用户组相关主机群组的权限

img

img

img

img

img

6、设置告警动作

img

img

img

img

img

img

条件解释:

  • 基于模版:当指定某个监控模板时,该模板所设定的全部触发器触发时,都会发送告警信息;

  • 基于主机:当指定某个主机时,该主机的所设定的全部触发器触发时,都会发送告警信息;

  • 基于触发器:当指定某个触发器时,该触发器触发时,才会发送告警信息;

  • 基于主机群组:当指定某个主机群组时,该主机群组所有的模板中的触发器所设定的全部触发器触发时,都会发送告警;

img

zabbix 6.0结合企业微信进行告警

1、注册企业微信

2、创建群组机器人

img

img

img

3、web界面配置

img

img

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
var Wechat = {
token: null,
to: null,
message: null,
parse_mode: null,

sendMessage: function() {
var params = {
msgtype: "markdown",
chat_id: Wechat.to,
markdown: {
content:Wechat.message
},
disable_web_page_preview: true,
disable_notification: false
},
data,
response,
request = new CurlHttpRequest(),
url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=5043aed8-f801-4410-b4d3-82ac4e214883';

if (Wechat.parse_mode !== null) {
params['parse_mode'] = Wechat.parse_mode;
}

request.AddHeader('Content-Type: application/json');
data = JSON.stringify(params);

// Remove replace() function if you want to see the exposed token in the log file.
Zabbix.Log(4, '[Wechat Webhook] URL: ' + url.replace(Wechat.token, '<TOKEN>'));
Zabbix.Log(4, '[Wechat Webhook] params: ' + data);
response = request.Post(url, data);
Zabbix.Log(4, '[Wechat Webhook] HTTP code: ' + request.Status());
Zabbix.Log(4, '[Wechat Webhook] response: ' + response);

try {
response = JSON.parse(response);
}
catch (error) {
response = null;
Zabbix.Log(4, '[Wechat Webhook] response parse error');
}

if (request.Status() !== 200 || response.errcode !== 0 || response.errmsg !== 'ok') {
if (typeof response.errmsg === 'string') {
throw response.errmsg;
}
else {
throw 'Unknown error. Check debug log for more information.'
}
}
}
}

try {
var params = JSON.parse(value);

if (typeof params.Token === 'undefined') {
throw 'Incorrect value is given for parameter "Token": parameter is missing';
}

Wechat.token = params.Token;

if (['Markdown', 'HTML', 'MarkdownV2'].indexOf(params.ParseMode) !== -1) {
Wechat.parse_mode = params.ParseMode;
}

Wechat.to = params.To;
Wechat.message = params.Subject + '\n' + params.Message;
Wechat.sendMessage();

return 'OK';
}
catch (error) {
Zabbix.Log(4, '[Wechat Webhook] notification failed: ' + error);
throw 'Sending failed: ' + error + '.';
}

注意修改其中的Key值

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
主题:【监控告警】主机: <font color="warning">{HOST.NAME}</font>  IP地址:<font color="warning">{HOST.IP}</font>
消息:
>主机名称:**<font color="comment">{HOST.NAME}</font>**
>主机IP:<font color="comment">{HOST.IP}</font>
>告警时间:<font color="comment">{EVENT.DATE}-{EVENT.TIME}</font>
>问题名称:<font color="warning">{EVENT.NAME}</font>
>问题详情:<font color="comment">{ITEM.NAME}:{ITEM.VALUE}</font>
>目前状态:<font color="comment">{TRIGGER.STATUS}</font>
>操作数据:<font color="comment">{EVENT.OPDATA}</font>


# 或者
主题:

### 【监控告警】主机: <font color="warning">{HOST.NAME}</font> IP地址:<font color="warning">{HOST.IP}</font>

消息:
>主机名称:**<font color="comment">{HOST.NAME}</font>**
>主机IP:<font color="comment">{HOST.IP}</font>
>告警时间:<font color="comment">{EVENT.DATE}-{EVENT.TIME}</font>
>问题名称:<font color="warning">{EVENT.NAME}</font>
>问题详情:<font color="comment">{ITEM.NAME}:{ITEM.VALUE}</font>
>目前状态:<font color="comment">{TRIGGER.STATUS}</font>
>操作数据:<font color="comment">{EVENT.OPDATA}</font>

4、报警媒介测试

img

img

img

img

5、用户配置

img

img

6、动作配置

img

img

img

7、测试微信告警

1
2
# 被监控端关闭nginx
[root@web-01 zabbix_agent2.d]# systemctl stop nginx

img

img

zabbix 6.0 结合飞书进行告警

1、操作步骤

  • 飞书创建群组-添加自定义机器人,复制自定义机器人的webhook地址;

  • zabbix服务器脚本目录下新建feishu.py脚本,并配置webhook地址;

  • 创建zabbix报警媒介类型,用户添加报警媒介;

  • 创建动作,配置操作。

1.1 webhook介绍

飞书中的自定义机器人Webhook地址用于接收和响应群组中的消息

在飞书平台中,创建群组并添加自定义机器人后,会得到一个webhook地址。这个地址是一个HTTP接口,它的主要作用如下:

  1. 消息推送:当你需要将外部系统的信息自动推送到飞书群组时,可以通过调用这个webhook地址来实现。例如,你可以使用它来发送天气预报、日程提醒或者工作状态更新等信息。

  2. 自动化流程:结合其他工具或服务,webhook可以实现工作流程的自动化。例如,当某个任务在外部系统中完成时,通过webhook通知群组成员,实现任务的自动跟进和管理。

  3. 集成第三方服务:通过webhook地址,可以将飞书群组与其他第三方服务(如GitHub、Jira等)集成,使得群组成为各种信息交流和协作的中心。

总的来说,自定义机器人的webhook地址是实现飞书群组智能自动化功能的关键,它允许用户根据自己的需求定制机器人的行为,从而提高工作效率和群组互动的质量。

2、飞书相关操作

img

img

img

img

img

设置机器人名称、描述,复制保存生成的webhook地址。

img

img

1
https://open.feishu.cn/open-apis/bot/v2/hook/2e9b42ff-6977-4bbd-80b1-cd796787fb5c

3、创建飞书脚本文件

登录zabbix服务器,进入到/usr/lib/zabbix/alertscripts/目录,新建feishu.py文件。

1
[root@zabbix-server01 ~]# vim /usr/local/share/zabbix/alertscripts/feishu.py
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
#!/usr/bin/python3
import requests
import json
import sys
import os
import datetime

url = "https://open.feishu.cn/open-apis/bot/v2/hook/2e9b42ff-6977-4bbd-80b1-cd796787fb5c" #你复制的webhook地址粘贴进url内


def send_message(message):
payload_message = {
"msg_type": "text",
"content": {
"text": message
}
}
headers = {
'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=json.dumps(payload_message))
return response


if __name__ == '__main__':
text = sys.argv[1]
send_message(text)
1
2
3
4
5
# 安装python3
[root@zabbix-server01 ~]# yum install -y python3
[root@zabbix-server01 ~]# pip-3 install requests
# 脚本增加执行权限
[root@zabbix-server01 ~]# chmod +x /usr/local/share/zabbix/alertscripts/feishu.py

4、zabbix web配置报警媒介

img

img

配置Message template

img

img

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
# 问题

#主题:
异常通知: {EVENT.NAME}

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

------------------------------------------------------------

# 恢复操作

#主题:
恢复通知: {EVENT.NAME}

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

img

img

img

img

5、创建用户群组和用户

详细请见zabbix 6.0 结合邮箱告警用户组和用户创建

6、触发器动作创建

img

img

img

img

7、测试飞书告警

1
2
# 被监控端关闭nginx
$ systemctl stop nginx

img

img

1
2
# 启动nginx
$ systemctl start nginx

img