igozhang

——

    Zabbix6 严重告警电话通知配置方法

    本文档为脱敏版本,域名、IP、电话号码等已替换为示例值,仅供流程参考。

    ENV

    项目 信息
    K8s 节点 zabbix38(control-plane,单节点)
    节点 OS Ubuntu 20.04.6 LTS,Kernel 5.4.0-216
    K8s v1.29.10,containerd 1.6.28
    Namespace zabbix
    Zabbix Server 6.0.46(Pod 内 Ubuntu 24.04)
    组件 Pod zabbix-zabbix-serverzabbix-postgresql-0zabbix-zabbix-web
    Web https://zabbix-hu.igozhang.cn
    告警脚本目录 /usr/lib/zabbix/alertscripts(Pod 内)
    电话 API http://10.10.10.177:8080/call/tts
    被叫号码 13088888888
    主叫显示 057188887718
    TTS 模板 TTS_326260143

    1. 需求

    • Zabbix High(严重)+ Disaster(灾难) 触发器告警时,拨打固定号码 13088888888
    • 告警内容通过阿里云 TTS 语音播报
    • 恢复时不打电话
    • 主机 Agent 不可用视为 High 级别(默认 Average 不触发电话)

    2. 解决方案

    2.1 部署告警脚本(K8s ConfigMap + 挂载)

    执行位置: zabbix38

    变更说明: 创建 ConfigMap,修改 Deployment,触发 zabbix-server Pod 滚动重启。

    cat > /igo/zabbix-phonecall.sh << 'SCRIPT_EOF'
    #!/bin/bash
    TO="${1:-13088888888}"
    MESSAGE="${3:-Zabbix告警}"
    MESSAGE=$(echo "$MESSAGE" | tr '\n\r' ' ' | head -c 150)
    MSG_ESC=$(printf '%s' "$MESSAGE" | sed 's/\\/\\\\/g; s/"/\\"/g')
    PAYLOAD="{\"called_number\":\"${TO}\",\"called_show_number\":\"057188887718\",\"tts_code\":\"TTS_326260143\",\"tts_param\":\"{\\\"info\\\": \\\"${MSG_ESC}\\\"}\"}"
    wget -q --timeout=10 --header="Content-Type: application/json" --post-data="$PAYLOAD" -O /dev/null http://10.10.10.177:8080/call/tts
    exit $?
    SCRIPT_EOF
    
    chmod 755 /igo/zabbix-phonecall.sh
    
    kubectl create configmap zabbix-alertscripts -n zabbix \
      --from-file=phonecall.sh=/igo/zabbix-phonecall.sh \
      --dry-run=client -o yaml | kubectl apply -f -
    
    kubectl patch deployment zabbix-zabbix-server -n zabbix --patch '
    spec:
      template:
        spec:
          volumes:
          - name: alertscripts
            configMap:
              name: zabbix-alertscripts
              defaultMode: 0755
          containers:
          - name: zabbix-server
            volumeMounts:
            - name: alertscripts
              mountPath: /usr/lib/zabbix/alertscripts
    '
    

    验证脚本部署:

    kubectl rollout status deployment/zabbix-zabbix-server -n zabbix --timeout=60s
    kubectl exec -n zabbix deploy/zabbix-zabbix-server -c zabbix-server -- \
      ls -la /usr/lib/zabbix/alertscripts/phonecall.sh
    

    验证外呼(会真实拨打电话):

    kubectl exec -n zabbix deploy/zabbix-zabbix-server -c zabbix-server -- sh -c \
      '/usr/lib/zabbix/alertscripts/phonecall.sh "13088888888" "Test" "Zabbix电话告警测试,请忽略"; echo "exit_code=$?"'
    

    预期:exit_code=0,手机接到测试电话。


    2.2 Web 配置:媒介类型

    路径: 管理 → 报警媒介类型 → 创建

    Media type 标签页:

    字段
    名称 Phone Call TTS
    类型 Script
    脚本名称 phonecall.sh
    脚本参数 {ALERT.SENDTO} / {ALERT.SUBJECT} / {ALERT.MESSAGE}
    已启用

    Message templates 标签页 → Add(必填,否则报 No message defined for media type):

    字段
    Message type Problem
    Subject {TRIGGER.NAME} - {HOST.NAME}
    Message 主机{HOST.NAME}触发告警{TRIGGER.NAME},请及时处理

    Script 类型无 Web 测试按钮,用 2.1 命令行测试即可。


    2.3 Web 配置:用户媒介

    路径: 管理 → 用户 → 目标用户 → 报警媒介 → 添加

    字段
    类型 Phone Call TTS
    发送到 13088888888
    如果已启用
    严重性 仅勾选 灾难、严重

    保存用户(须点用户页底部 Update)。


    2.4 Web 配置:触发器动作

    路径: 配置 → 动作 → 触发器动作 → 创建

    页签 配置
    动作 名称 Phone alert High Disaster,已启用 ✅
    条件 触发器严重性 ≥ 严重
    操作 发送消息给用户;仅发送到 Phone Call TTS;默认操作步骤持续时间 86400(24h,避免重复拨打)
    恢复操作 留空(恢复不打电话)

    重载配置缓存:

    kubectl exec -n zabbix deploy/zabbix-zabbix-server -c zabbix-server -- \
      zabbix_server -R config_cache_reload
    

    验证 DB 配置入库:

    kubectl exec -n zabbix zabbix-postgresql-0 -- psql -U zabbix -d zabbix -Atc \
      "SELECT 'action|'||name||'|enabled='||(CASE WHEN status=0 THEN 'yes' ELSE 'no' END) FROM actions WHERE eventsource=0 AND name ILIKE '%phone%';
       SELECT 'media|'||name FROM media_type WHERE name ILIKE '%phone%';
       SELECT 'user_media|'||u.username||'|sendto='||m.sendto FROM media m
         JOIN users u ON u.userid=m.userid
         JOIN media_type mt ON mt.mediatypeid=m.mediatypeid WHERE mt.name ILIKE '%phone%';"
    

    2.5 主机不可用告警升级为 High

    默认 Linux: Zabbix agent is not available 严重性为 Average(3),不满足电话动作条件(≥ High)。

    路径: 配置 → 模板 → Linux by Zabbix agent → 触发器

    触发器 修改
    Linux: Zabbix agent is not available 严重性改为 High

    加快 Not available → Problem 延迟(可选):

    路径: 配置 → 模板 → Linux by Zabbix agent → 宏

    默认 建议
    {$AGENT.TIMEOUT} 3m 1m

    面板 Not available 即时更新;Problem 需等待 {$AGENT.TIMEOUT} 窗口。改小会加快告警,但误报风险增加。


    2.6 端到端验证

    1. 停目标主机 Agent:systemctl stop zabbix-agent
    2. 等待 {$AGENT.TIMEOUT}(如 1m 或 3m)
    3. 监测 → 问题 出现 High 级 Zabbix agent is not available
    4. 点击 Actions 列,Phone Call TTS 状态应为 Sent
    5. 手机 13088888888 接到语音告警

    查日志(可选):

    kubectl exec -n zabbix deploy/zabbix-zabbix-server -c zabbix-server -- sh -c \
      'grep -iE "phonecall|Phone Call|executing script|No message" /var/log/zabbix/zabbix_server.log | tail -30'
    

    验证完成后恢复 Agent:

    systemctl start zabbix-agent
    

    附录:常见问题

    现象 原因 处理
    Not available 有,Problems 无 触发器等待 {$AGENT.TIMEOUT} 等待或调小宏
    有 High Problem,电话 Failed Message templates 未配置 补 Problem 模板
    有 Problem 但不打电话 严重性 < High 或动作/用户媒介未保存 查 DB 验证命令
    Script 无 Web 测试 Zabbix 6.0 正常行为 用命令行测试脚本

    MP3