普通网友 2025-10-02 01:40 采纳率: 98.4%
浏览 0
已采纳

Zabbix对接钉钉消息发送失败如何排查?

Zabbix对接钉钉消息发送失败时,常见问题之一是自定义媒介脚本无法正确调用钉钉Webhook接口。可能原因包括:脚本权限不足、Python或curl命令未安装、Webhook URL配置错误、网络不通或SSL证书验证失败。此外,Zabbix服务器未授权执行脚本或参数传递不正确也会导致发送失败。需检查Zabbix Server日志(zabbix_server.log)中媒介调用的错误详情,并在命令行手动测试脚本执行结果,确认能否正常发送消息。同时确保钉钉群机器人安全策略(如关键词、IP白名单)配置正确。
  • 写回答

1条回答 默认 最新

  • 白萝卜道士 2025-10-02 01:40
    关注

    1. 问题背景与常见现象

    Zabbix作为企业级监控系统,常通过自定义媒介(Media Type)集成钉钉机器人实现告警消息推送。然而在实际部署中,部分用户反馈“消息发送失败”,尤其体现在自定义脚本调用钉钉Webhook接口时无响应或返回错误码。

    典型表现为:Zabbix前端显示“Sent: No”,zabbix_server.log日志中出现类似如下记录:

    Failed to send notification via media type "DingTalk": script execution returned error.

    该类问题涉及多个技术层面,需从权限、环境依赖、网络通信、配置逻辑及第三方平台策略等多个维度排查。

    2. 常见原因分类与层级分析

    1. 脚本执行权限不足:Zabbix Server以特定用户(如 zabbix)运行,若脚本所在路径或文件本身未赋予可执行权限,则无法调用。
    2. 依赖工具缺失:脚本依赖 curlpython 环境,但目标主机未安装或路径未加入环境变量。
    3. Webhook URL 配置错误:URL拼写错误、包含空格、使用了测试机器人但已过期等。
    4. 网络连通性问题:防火墙限制、DNS解析失败、出站代理未配置导致无法访问 https://oapi.dingtalk.com
    5. SSL证书验证失败:特别是在内网环境中启用了中间人代理或自签名证书时,curl 默认会拒绝连接。
    6. Zabbix未授权执行外部脚本AllowExternalScripts=1 参数未启用。
    7. 参数传递不正确:Zabbix传参格式不符合脚本预期,如顺序错乱、特殊字符未转义。
    8. 钉钉安全策略限制:关键词校验未匹配、IP白名单未添加Zabbix服务器出口IP。
    9. 脚本逻辑缺陷:JSON构造错误、HTTP头缺失、未处理异常分支。
    10. 并发或超时限制:短时间内大量请求触发钉钉限流机制。

    3. 排查流程图(Mermaid)

    graph TD
        A[开始] --> B{脚本能手动执行吗?}
        B -- 是 --> C{是否收到钉钉消息?}
        B -- 否 --> D[检查脚本权限 & 所属用户]
        D --> E[chmod +x /path/to/script.py]
        C -- 否 --> F[检查Webhook URL有效性]
        F --> G[测试curl直接调用接口]
        G --> H{返回ok?}
        H -- 否 --> I[检查网络/SSL/IP白名单]
        H -- 是 --> J[检查Zabbix媒介参数映射]
        I --> K[配置proxy或跳过SSL验证]
        J --> L[确认$1,$2,$3传递正确]
        L --> M[查看zabbix_server.log详细错误]
        M --> N[修复并重新测试]
        

    4. 关键配置检查清单

    检查项建议值/操作相关配置文件
    AllowExternalScripts1zabbix_server.conf
    AlertScriptsPath/usr/lib/zabbix/alertscriptszabbix_server.conf
    脚本权限chown zabbix:zabbix script.py; chmod +x script.pyOS级别
    curl 是否可用which curl || yum install curlShell命令
    Python 是否存在python3 --versionShell命令
    DingTalk Webhookhttps://oapi.dingtalk.com/robot/send?access_token=xxxxZabbix媒介配置
    安全策略关键词“告警”或IP白名单包含Zabbix IP钉钉群机器人设置
    日志路径/var/log/zabbix/zabbix_server.logzabbix_server.conf

    5. 脚本调试与命令行验证示例

    以下是一个典型的Python脚本用于发送钉钉消息:

    #!/usr/bin/env python3
    import sys
    import requests
    import json
    
    webhook = "https://oapi.dingtalk.com/robot/send?access_token=your_token_here"
    message = {
        "msgtype": "text",
        "text": {
            "content": f"【Zabbix告警】\n主题: {sys.argv[1]}\n内容: {sys.argv[2]}"
        }
    }
    
    try:
        resp = requests.post(webhook, data=json.dumps(message), headers={"Content-Type": "application/json"}, timeout=5, verify=True)
        if resp.json().get('errcode') == 0:
            print("OK")
        else:
            print(f"Error: {resp.text}")
    except Exception as e:
        print(f"Exception: {e}")
        

    在命令行手动执行测试:

    sudo -u zabbix /usr/lib/zabbix/alertscripts/dingtalk.py "主机宕机" "Server 192.168.10.100 is down"

    观察输出是否为“OK”,并确认钉钉群是否收到消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 10月2日