www.colben.cn/content/post/zabbix-alert-wechat.md
2021-11-14 15:52:46 +08:00

191 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Zabbix 企业微信告警"
date: 2019-10-29T21:26:35+08:00
lastmod: 2021-04-11T01:00:00+08:00
keywords: []
tags: ["zabbix", "微信", "告警"]
categories: ["zabbix"]
---
## 环境
- CentOS7docker-ce 20.0
- 启动 zabbix5 容器
```bash
docker run -d \
--net host \
--name zabbix \
harbor.colben.cn/general/alpine-zabbix
```
- 打开浏览器,访问 http://ip/zabbix/,打开 zabbix web 安装界面
- 不要做任何修改,一直下一步,直到打开 zabbix 登陆页面,默认 Admin/zabbix
## 部署脚本
- 进入 zabbix 容器中
- 安装 jq 命令
- 修改 /etc/zabbix/zabbix_server.conf配置告警脚本加载位置
```
AlertScriptsPath=/var/log/zabbix/alertscripts
```
- 创建 /var/log/zabbix/alertscripts/wechat.sh内容如下
```bash
set -euo pipefail
export LANG=en_US.UTF-8
trap Quit EXIT
# 企业 ID
CORP_ID='ww11112222aaaabbbb'
# 应用 Secret
CORP_SECRET='ABCDefghIJKLmnopQRSTuvwxYZ0000111122223333U'
# 应用 ID
AGENT_ID='1000002'
# 多个用户之间用"| 间隔
TO_USER='@all'
# 部门 ID
TO_PARTY='1'
# token 文件存放位置
TOKEN_FILE='/tmp/wechat_token'
function Print {
echo -e "$(date +'[%F %T] INFO') $*"
}
function Warn {
echo -e "$(date +'[%F %T] WARN') $*"
}
function Error {
echo -e "$(date +'[%F %T] ERRRO') $*"
exit 1
}
function Quit {
[ 0 -ne $? ] && rm -f $TOKEN_FILE && Error Failed to alert!
[ -z "${END:-}" ] && echo && Error Interrupted manually!
Print Succeeded to alert.
}
function RequestToken {
Warn Request token ...
date +%s > $TOKEN_FILE
local response=$(curl -sSL \
"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CORP_ID&corpsecret=$CORP_SECRET")
local errcode=$(echo "$response" | jq -erM .errcode)
local errmsg=$(echo "$response" | jq -erM .errmsg)
[ 0 -ne $errcode -a 'ok' != "$errmsg" ] && Error Request token failed: $errcode, $errmsg!
echo $response | jq -erM .access_token >> $TOKEN_FILE
}
function GetToken {
[ ! -e $TOKEN_FILE ] && RequestToken && return
Warn Get token from localfile ...
local now=$(date +%s)
local token="$(sed -n 2p $TOKEN_FILE)"
local token_time=$(sed -n 1p $TOKEN_FILE)
if [ $((now-token_time)) -gt 7200 ]; then
Warn Local token expired ...
RequestToken
fi
}
function SendMsg {
Warn Send message: $1 ...
local token=$(sed -n 2p $TOKEN_FILE)
local response=$(curl -sSL -X POST \
-H "Content-Type: application/json" \
"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$token" \
-d @- <<-EOF
{
"touser": "$TO_USER",
"toparty": "$TO_PARTY",
"msgtype": "text",
"agentid": "$AGENT_ID",
"text": {
"content": "$1\n$2"
},
"safe": 0
}
EOF
)
local errcode=$(echo "$response" | jq -erM .errcode)
local errmsg="$(echo "$response" | jq -erM .errmsg)"
[ 0 -eq $errcode -o 'ok' = "$errmsg" ] || Error Send msg failed: $errcode, $errmsg!
}
# Start here
GetToken
SendMsg "$1" "$2"
END=1
```
- 重启 zabbix 容器
- 测试脚本,如果企业微信能收到信息则表示脚本正常
```bash
/var/log/zabbix/alertscripts/wechat.sh test_subject test_content
```
## 配置 zabbix
- 浏览器登陆 zabbix
- 单击"管理"-"报警媒介类型"-"创建媒体类型",输入如下信息
- 名称: 企业微信
- 类型: 脚本
- 脚本名称: wechat.py
- 脚本参数:
- {ALERT.SUBJECT}
- {ALERT.MESSAGE}
- 其它默认,单击"添加"
- 单击"管理"-"用户"-"Admin"-"报警媒介"-"添加",输入如下信息
- 类型: 企业微信
- 收件人: 这一项用不到了,随便写 ...
- 其它默认,单击"添加"
- 单击"配置"-"动作"-"Report problems to Zabbix administrators"
- 在"动作"标签页下,选中"已启用"
- 在"操作"标签页下,输入如下信息
- 默认标题:
```
XXXX系统 {HOST.NAME} 故障: {TRIGGER.NAME}
```
- 消息内容:
```
服务器: {HOST.NAME}\n
故障时间: {EVENT.DATE} {EVENT.TIME}\n
故障名称: {TRIGGER.NAME}\n
故障状态: {TRIGGER.STATUS}\n
故障等级: {TRIGGER.SEVERITY}\n
故障编号: ID: {EVENT.ID}\n
监控项: {ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1})\n
监控值:\n
{ITEM.VALUE1}
```
- 单击"操作"框中的"编辑",打开"操作细节"框,输入如下信息
- 操作类型: 发送消息
- 发送到用户: "添加" Admin 用户
- 仅送到: 企业微信
- 其他默认,单击"更新"
- 在"恢复操作"标签页下,输入如下信息
- 默认标题:
```
XXXX系统 {HOST.NAME} 恢复: {TRIGGER.NAME}
```
- 消息内容:
```
服务器: {HOST.NAME}\n
恢复时间: {EVENT.DATE} {EVENT.TIME}\n
故障名称: {TRIGGER.NAME}\n
故障状态: {TRIGGER.STATUS}\n
故障等级: {TRIGGER.SEVERITY}\n
故障编号: ID: {EVENT.ID}\n
监控项: {ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1})\n
监控值:\n
{ITEM.VALUE1}
```
- 单击"操作"框中的步骤1的"编辑",打开"操作细节"框,输入如下信息
- 操作类型: 发送消息
- 发送到用户: "添加" Admin 用户
- 仅送到: 企业微信
- 其他默认,单击"更新"
- 忽略"更新操作"
- 其他默认,单击"更新"