2024 Zabbix中国峰会 关于我们 联系我们 加入我们
5

Zabbix问题告警如何实现处理闭环?

感谢本文作者 蔡斯Zabbix社区签约专家。诚邀大家投稿!

Zabbix有奖投稿详细规则请见 👉 文章!

摘 要

本文分享笔者在Zabbix实践过程中,如何利用Zabbix自带的问题确认(ACK)功能,实现告警问题的闭环。从而让系统运维保障团队的问题处理过程,即可实时反馈进度,亦可满足团队的质量管控要求。

图片

一、搭建Zabbix6.2平台

通过Docker快速搭建Zabbix 6.2的最新版本。

1.1、创建Zabbix专属网络

创建Zabbix组件虚拟子网:Zabbix-Subnet

docker network create --subnet 172.10.0.0/16 --ip-range 172.10.240.0/20 Zabbix-Subnet

1.2、运行Zabbix MySQL容器

选择MySQL8.0作为Zabbix监控数据的存储引擎。
docker run --name Zabbix-MySQL -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-v /etc/localtime:/etc/localtime:ro \
-d mysql:8.0 \
--character-set-server=utf8 \
--collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password

1.3、运行Zabbix Server容器

本文使用企业微信群机器人作为告警媒介,为确保容器能正常请求Webhook地址,通过--add-host绑定hosts实现强制解析,可根据实际情况配置。
docker run --name Zabbix-Server -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
--hostname="Zabbix-Server" \
-e DB_SERVER_HOST="Zabbix-MySQL" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-e ZBX_NODEADDRESS="Zabbix-Server" \
-v /etc/localtime:/etc/localtime:ro \
-p 10051:10051 \
--add-host qyapi.weixin.qq.com:157.148.55.111 \
-d zabbix/zabbix-server-mysql:alpine-6.2-latest

1.4、运行Zabbix Agent2容器

Zabbix Agent2基于Go语言开发,作为Zabbix Agent替代品,它几乎集成了Zabbix Agent原有的所有功能,且易于通过Go插件实现第三方功能。
docker run --name Zabbix-Agent -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e ZBX_HOSTNAME="Zabbix server" \
-e ZBX_SERVER_HOST="Zabbix-Server" \
-e ZBX_SERVER_PORT="10051" \
-v /etc/localtime:/etc/localtime:ro \
--privileged \
-d zabbix/zabbix-agent2:alpine-6.2-latest

值得提及的是,Zabbix Agent2已内置证书校验功能,再无需通过复杂的openssl的脚本实现,效果如下:

docker exec -it Zabbix-Server zabbix_get -s Zabbix-Agent -k web.certificate.get[zabbix.com,,104.26.7.148] | python -m json.tool
{
    "result": {
        "message""certificate verified successfully",
        "value""valid"
    },
    "sha1_fingerprint""8b5889c0a9ecb12a7f4ec1e2c91d70eebb70aa4a",
    "sha256_fingerprint""22a31bd36212fd11bedaba8a3cd66e113710d68c2725b37ebd8c10c2ff49cc56",
    "x509": {
        "alternative_names": [
            "*.zabbix.com",
            "zabbix.com",
            "sni.cloudflaressl.com"
        ],
        "issuer""CN=Cloudflare Inc ECC CA-3,O=Cloudflare\\, Inc.,C=US",
        "not_after": {
            "timestamp": 1685750399,
            "value""Jun 02 23:59:59 2023 GMT"
        },
        "not_before": {
            "timestamp": 1654214400,
            "value""Jun 03 00:00:00 2022 GMT"
        },
        "public_key_algorithm""ECDSA",
        "serial_number""014937aa9f28ce4846ddfb7109cbfb0e",
        "signature_algorithm""ECDSA-SHA256",
        "subject""CN=sni.cloudflaressl.com,O=Cloudflare\\, Inc.,L=San Francisco,ST=California,C=US",
        "version": 3
    }
}

1.5、运行Zabbix Web容器

选择Nginx作为ZabbixWeb前端引擎。
docker run --name Zabbix-Web -t \
--restart unless-stopped \
--network=Zabbix-Subnet \
-e PHP_TZ="Asia/Shanghai" \
-e DB_SERVER_HOST="Zabbix-MySQL" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zb-passwd" \
-e MYSQL_ROOT_PASSWORD="zb-passwd" \
-v /etc/localtime:/etc/localtime:ro \
-p 80:8080 \
-d zabbix/zabbix-web-nginx-mysql:alpine-6.2-latest

1.6、配置Zabbix Agent

Zabbix-Server容器启动时已配置链接到Zabbix-Agent,容器内部可直接找到,故这里的接口类型使用DNS方式即可。

图片批量创建Zabbix-AgentN容器并正确配置后,稍等片刻再次刷新仪表盘,查看已能正常收集数据。

图片

二、创建Zabbix用户和告警媒介

2.1、添加Zabbix告警用户

目前Zabbix已具备完整的用户权限管理体系,我们可以通过设置不同群组不同用户授予不同操作和查看权限,满足运维团队的精细化管理。
根据系统保障团队特点,通常需要创建一、二线两种运维角色。通过左侧导航->管理->用户群组,创建一个名为 系统保障团队的群组,主机权限视具体情况勾选主机群组、并授予 或 读写,如下图所示:

图片

左侧导航->管理->用户,创建两个Zabbix Web用户,"用户名"分别为:servicedeskappadmin,"用户名第一部分"分别为:运维服务台(一线)应用运维(二线)。群组均为:系统保障团队,如下图所示:

图片切到用户权限页,勾选角色为:User role,当然这里可视实际情况而定,如下图所示:

图片

2.2、添加企业微信群机器人

创建一个Zabbix告警通知专用企微群,通过群窗口进入管理界面。点击添加群机器人赋予名字后,复制地址获取完整WebHook链接。
图片

2.3、创建Webhook告警媒介

左侧导航->管理->媒介->创建媒介类型,填入名称"WXWork_RoBot",点击编辑脚本,复制以下内容进行填充。

try {
var params = JSON.parse(value),
request = new HttpRequest(),
msg = {
msgtype: 'markdown',
markdown: {
content: params.Subject + '\n' + params.Message
}
},
response;
if (params.HTTPProxy) {
request.setProxy(params.HTTPProxy);
}
request.addHeader('Content-Type: application/json');
response = request.post(params.To,JSON.stringify(msg)
);
response = JSON.parse(response);
if (request.getStatus() != 200) {
throw 'Response Status: ' + request.getStatus();
}
if (response.errcode !== 0) {
throw 'Response errcode: ' + response.errcode + '\n' + 'Response errmsg: ' + response.errmsg;
}
return JSON.stringify(response);
}catch (error) {
throw 'Sending failed: ' + error;
}

其他参数保持和下图一致即可。

图片


2.4、测试Webhook告警媒介

Zabbix Web端同样提供WebHook媒介的测试,以便验证配置的正确性。通过左侧导航->管理->媒介,找到"WXWork_RoBot",在动作列点击 测试。参数说明:

  • HTTPProxyHTTP代理:留空
  • Message消息体输入:"测试内容、测试内容"
  • Subject标题体输入"# 测试标题"
  • To发送体输入:企微Webhook机器人完整链接

图片


点击下方测试,如无例外,在企微专用告警群里,你会收到机器人 小Z发出的如下消息:

图片

假若告警媒介出现问题,JS脚本会自动抛出对应异常信息,如下图所示:

图片

如下是输入错误的企微机器人地址后抛出的异常
Sending failed: Response errcode: 93000 Response errmsg: invalid webhook url, hint: [1670835060365200618705084], from ip: x.x.x.x, more info at https://open.work.weixin.qq.com/devtool/query?e=93000

2.5、配置Zabbix告警动作

Zabbix的告警动作对检测到的异常采取不同的通知措施。这里,通过左侧导航->配置->动作->触发器动作,创建三种告警动作:告警动作告警恢复动作告警更新动作,来实现系统保障团队对告警的闭环处理。
系统保障团队可通过自身情况选择将不同告警阶段动作的信息发送给不同的团队。配置过程中,三种告警动作参数全部保持一致,即发给用户组 Admin(Zabbix Administrator)、仅送到告警媒介 WXWork_Robot

图片

关于告警动作解释:
  • 告警动作,即当告警出现时,Zabbix将告警信息发送给哪些用户.
  • 告警恢复动作,即当告警恢复时,Zabbix将告警信息发送给哪些用户。
  • 告警恢复动作,即当告警信息变化时,Zabbix将变化发送给哪些用户。

最终触发器告警动作的完整视图,如下图所示:

图片

2.6、配置Zabbix告警消息模板

Zabbix告警动作需要结合对应报警媒介中的消息模板完成告警消息的推送,这里的消息模板分别对应前面配置三个告警动作,即:

  • 告警动作->消息模板:问题
  • 告警恢复动作->消息模板:问题恢复
  • 告警更新动作->消息模板:问题更新

最终配置,如下图所示:

图片图片图片

三、Zabbix6.2动作之更新操作通知

3.1、触发Zabbix告警消息

为了校验告警有效性,通常需要人为触发告警。当然,触发方式由很多种,你可以缩短item收集时间,也可以暴力直接拉升服务器负载。
这里通过Zabbix Agent节点执行dd命令,迅速拉满节点CPU,触发Zabbix告警。

cpu_count=`cat /proc/cpuinfo | grep "physical id" | wc -l`;echo "当前节点核心数: ${cpu_count} 个";for i in `seq 1 ${cpu_count}`; do echo -e "--------\n正在拉满核心${i}"; dd if=/dev/zero of=/dev/null & sleep 5; done
当前节点核心数: 2 个
--------
正在拉满核心1
[1] 5802
--------
正在拉满核心2
[2] 5807

通过 top -H很快就能看到 CPU idel值已接近或处于0,告警在即。

图片

PS:结束上述命令可以使用 pkill -9 dd

3.2、接收Zabbix告警消息

人为触发告警后,一线服务台巡检或听到告警音(如启用)仪表盘时,就会已看到告警条。

图片在企微专用告警群里,成功接收到告警信息,如下图所示:

图片

3.3、处置Zabbix告警消息

按系统保障团队工作流程机制,一线服务台需要在限定时间内电话知达当日值班二线或相关服务负责人。此时一线服务台在仪表盘上,点击告警条上的"否",对问题进行跟踪反馈。

图片



1)此时在告警群里,已看到一线服务台对Zabbix告警信息做出响应。

图片

2)当日值班二线或相关服务负责人收到告警后,立即对告警问题进行处置,如解决问题得到解决,对告警信息进行评价。

图片

3)Zabbix监控继续对问题项进行检索,如满足恢复条件,自动发送告警恢复信息。

图片

4)一线服务台接收到恢复告警后,确认并记录问题,最终完成整个告警问题的闭环处理。

图片

根据经验,在运维事件管理中,有效地记录系统保障人员的问题处理时间和根因分析,定期做复盘,这对提升团队的服务质量有很大的帮助。

四、小结

除了可以在线反馈问题处理进度外,Zabbix告警确认(ACK)功能还能改变告警等级从严或简单处理,通过也能对告警通知信息进行抑制和屏蔽。更多实用的功能,欢迎继续关注哦。

扫一扫|加入技术交流群

微信号|17502189550

备注“使用Zabbix年限+企业+姓名”

5000+用户已加入!

图片
图片

一个人走得快,一群人走得远!








2023-03-17