欢迎光临殡葬白事网
详情描述

方法一:使用 Zabbix Webhook 媒介(推荐)

1. 创建钉钉机器人

# 在钉钉群添加自定义机器人
# 获取 Webhook URL,格式如:
# https://oapi.dingtalk.com/robot/send?access_token=xxx

2. 创建 JavaScript 脚本

/usr/lib/zabbix/alertscripts/dingtalk.js

const https = require('https');
const url = require('url');

try {
    // 解析传入的参数
    const params = JSON.parse(process.argv[2]);

    // 钉钉机器人 Webhook URL
    const webhookUrl = params.webhook_url || 'YOUR_DINGTALK_WEBHOOK_URL';

    // 构建消息内容
    const message = {
        msgtype: "markdown",
        markdown: {
            title: `Zabbix告警: ${params.subject}`,
            text: `### ${params.subject}\n\n` +
                  `**告警级别**: ${params.severity}\n\n` +
                  `**主机**: ${params.hostname}\n\n` +
                  `**时间**: ${new Date().toLocaleString('zh-CN')}\n\n` +
                  `**问题**: ${params.message}\n\n` +
                  `**详情**: ${params.event_id ? `[查看事件](http://your-zabbix-server/zabbix.php?action=problem.view&eventid=${params.event_id})` : ''}`
        },
        at: {
            atMobiles: params.at_mobiles ? params.at_mobiles.split(',') : [],
            isAtAll: params.is_at_all === 'true'
        }
    };

    // 解析 URL
    const parsedUrl = url.parse(webhookUrl);

    const options = {
        hostname: parsedUrl.hostname,
        port: parsedUrl.port || 443,
        path: parsedUrl.path,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Content-Length': Buffer.byteLength(JSON.stringify(message))
        }
    };

    const req = https.request(options, (res) => {
        let data = '';

        res.on('data', (chunk) => {
            data += chunk;
        });

        res.on('end', () => {
            const response = JSON.parse(data);
            if (response.errcode === 0) {
                console.log('Message sent successfully');
                process.exit(0);
            } else {
                console.error(`Error: ${response.errmsg}`);
                process.exit(1);
            }
        });
    });

    req.on('error', (e) => {
        console.error(`Request error: ${e.message}`);
        process.exit(1);
    });

    // 发送请求
    req.write(JSON.stringify(message));
    req.end();

} catch (error) {
    console.error(`Script error: ${error.message}`);
    process.exit(1);
}

3. 设置脚本权限并测试

chmod +x /usr/lib/zabbix/alertscripts/dingtalk.js
chown zabbix:zabbix /usr/lib/zabbix/alertscripts/dingtalk.js

# 测试脚本
node /usr/lib/zabbix/alertscripts/dingtalk.js '{
    "webhook_url": "https://oapi.dingtalk.com/robot/send?access_token=xxx",
    "subject": "测试告警",
    "severity": "High",
    "hostname": "TestServer",
    "message": "CPU使用率超过90%",
    "event_id": "12345",
    "at_mobiles": "13800138000",
    "is_at_all": "false"
}'

方法二:使用 Zabbix Webhook 媒介类型

1. 在 Zabbix 前端配置

创建媒介类型:

管理媒介类型创建媒介类型 配置参数:
  • 名称:DingTalk Webhook
  • 类型:Webhook
  • 脚本:dingtalk.js

JavaScript 脚本内容:

try {
    // 解析传入的变量
    var params = JSON.parse(value),
        req = new HttpRequest(),
        resp;

    // 构建钉钉消息
    var message = {
        msgtype: "markdown",
        markdown: {
            title: "Zabbix告警: " + params.subject,
            text: "### " + params.subject + "\n\n" +
                  "**告警级别**: " + params.severity + "\n\n" +
                  "**主机**: " + params.hostname + "\n\n" +
                  "**时间**: " + params.datetime + "\n\n" +
                  "**问题**: " + params.message + "\n\n" +
                  "**详情**: [查看事件](" + params.event_url + ")"
        },
        at: {
            atMobiles: params.at_mobiles ? params.at_mobiles.split(',') : [],
            isAtAll: params.is_at_all === 'true'
        }
    };

    // 添加自定义签名(如果需要)
    if (params.secret) {
        var timestamp = Date.now();
        var stringToSign = timestamp + "\n" + params.secret;
        var sign = CryptoJS.HmacSHA256(stringToSign, params.secret).toString(CryptoJS.enc.Base64);
        var signEncoded = encodeURIComponent(sign);
        params.webhook_url += "&timestamp=" + timestamp + "&sign=" + signEncoded;
    }

    // 发送请求
    req.addHeader('Content-Type: application/json');
    resp = req.post(params.webhook_url, JSON.stringify(message));

    // 解析响应
    if (req.getStatus() !== 200) {
        throw 'HTTP error: ' + req.getStatus();
    }

    var response = JSON.parse(resp);
    if (response.errcode !== 0) {
        throw 'DingTalk error: ' + response.errmsg;
    }

    return JSON.stringify({
        status: 'success',
        message: 'Message sent successfully'
    });

} catch (error) {
    return JSON.stringify({
        status: 'failed',
        error: error.toString()
    });
}

2. 配置媒介类型参数

必需的参数:

// 在媒介类型配置中添加这些参数
{name: "webhook_url", value: "{ALERT.SENDTO}"}
{name: "subject", value: "{ALERT.SUBJECT}"}
{name: "message", value: "{ALERT.MESSAGE}"}
{name: "hostname", value: "{HOST.HOST}"}
{name: "severity", value: "{TRIGGER.SEVERITY}"}
{name: "event_id", value: "{EVENT.ID}"}
{name: "datetime", value: "{EVENT.DATE} {EVENT.TIME}"}
{name: "event_url", value: "{$ZABBIX.URL}/zabbix.php?action=problem.view&eventid={EVENT.ID}"}

// 可选参数
{name: "at_mobiles", value: "{ALERT.MOBILE}"}
{name: "is_at_all", value: "false"}
{name: "secret", value: "YOUR_SECRET"}  // 钉钉机器人加签密钥

方法三:使用 Python 脚本(备用方案)

如果你更喜欢 Python,也可以使用以下脚本:

#!/usr/bin/env python3
# /usr/lib/zabbix/alertscripts/dingtalk.py

import json
import sys
import requests
import time
import hmac
import hashlib
import base64
import urllib.parse

def send_dingtalk(message, webhook_url, secret=None):
    """发送钉钉消息"""

    # 添加签名(如果需要)
    if secret:
        timestamp = str(round(time.time() * 1000))
        string_to_sign = f"{timestamp}\n{secret}"
        hmac_code = hmac.new(
            secret.encode('utf-8'),
            string_to_sign.encode('utf-8'),
            digestmod=hashlib.sha256
        ).digest()
        sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
        webhook_url = f"{webhook_url}&timestamp={timestamp}&sign={sign}"

    headers = {'Content-Type': 'application/json'}

    try:
        response = requests.post(
            webhook_url,
            data=json.dumps(message),
            headers=headers,
            timeout=10
        )
        result = response.json()

        if result.get('errcode') == 0:
            print("Message sent successfully")
            return True
        else:
            print(f"Error: {result.get('errmsg')}")
            return False

    except Exception as e:
        print(f"Request error: {str(e)}")
        return False

if __name__ == "__main__":
    try:
        # 解析参数
        params = json.loads(sys.argv[1])

        # 构建消息
        dingtalk_msg = {
            "msgtype": "markdown",
            "markdown": {
                "title": f"Zabbix告警: {params.get('subject', '')}",
                "text": f"### {params.get('subject', '')}\n\n"
                       f"**告警级别**: {params.get('severity', '')}\n\n"
                       f"**主机**: {params.get('hostname', '')}\n\n"
                       f"**时间**: {params.get('datetime', '')}\n\n"
                       f"**问题**: {params.get('message', '')}\n\n"
                       f"**详情**: [查看事件]({params.get('event_url', '')})"
            }
        }

        # 添加 @ 某人
        if params.get('at_mobiles'):
            dingtalk_msg['at'] = {
                'atMobiles': params['at_mobiles'].split(','),
                'isAtAll': params.get('is_at_all', 'false') == 'true'
            }

        # 发送消息
        success = send_dingtalk(
            dingtalk_msg,
            params['webhook_url'],
            params.get('secret')
        )

        sys.exit(0 if success else 1)

    except Exception as e:
        print(f"Script error: {str(e)}")
        sys.exit(1)

配置步骤总结

1. 钉钉机器人配置

在钉钉群创建自定义机器人 获取 Webhook URL 设置安全设置(关键词、加签、IP白名单)

2. Zabbix 配置步骤

创建脚本:将上述任一脚本放入 /usr/lib/zabbix/alertscripts/ 设置权限chmod +xchown zabbix:zabbix 创建媒介类型
  • 管理 → 媒介类型 → 创建媒介类型
  • 选择脚本类型或Webhook类型
  • 配置脚本和参数
创建用户媒介
  • 管理 → 用户 → 选择用户 → 媒介 → 添加
  • 类型选择 DingTalk
  • 收件人填写钉钉 Webhook URL
创建动作
  • 配置 → 动作 → 创建动作
  • 配置条件(触发器、主机组等)
  • 操作中发送消息到钉钉媒介

3. 测试配置

手动触发一个测试告警 检查钉钉群是否收到消息 查看 Zabbix 管理 → 报表 → 动作日志

注意事项

安全设置:钉钉机器人需要配置安全设置(IP白名单、关键词等) 频率限制:钉钉机器人有限频,避免频繁发送 编码问题:确保消息内容使用 UTF-8 编码 HTTPS:钉钉 Webhook 只支持 HTTPS 错误处理:脚本中要包含完善的错误处理 日志查看:查看 /var/log/zabbix/zabbix_server.log 调试问题

高级功能

消息模板:可以根据不同严重级别使用不同模板 @特定人员:通过手机号 @相关人员 按钮链接:在消息中添加快速操作按钮 签名验证:支持钉钉机器人的加签验证

选择适合你环境的方法进行配置即可。推荐使用 Webhook 媒介类型,因为它更灵活且易于维护。