1. Zabbix短信告警的必要性与场景分析在企业IT运维中监控系统的告警功能就像24小时值班的保安。当服务器出现异常时邮件告警可能会被淹没在收件箱里而短信告警能像警铃一样直达运维人员手机。我们团队曾遇到一个典型案例某电商平台大促期间凌晨3点数据库连接池耗尽正是短信告警让运维团队在5分钟内响应避免了千万级损失。短信告警特别适合以下场景高优先级事件如核心服务宕机、数据库主从切换非工作时间响应深夜或节假日的突发故障多级告警策略配合邮件、企业微信形成告警升级机制2. 第三方短信平台接入准备2.1 平台选择与账号申请国内主流云服务商都提供短信服务这里以阿里云为例其他平台流程类似登录阿里云控制台进入「短信服务」模块申请「国内消息」或「国际消息」权限在「快速学习」栏目获取API文档和SDK重要提示企业认证账号每日有100条免费测试短信正式环境建议购买套餐包2.2 关键参数获取在短信平台需要准备三个关键信息AccessKey相当于账号密码在「AccessKey管理」页面创建签名如「【XX科技】」需企业资质备案模板ID审核通过的模板代码例如「您的告警${content}」这是我踩过的坑有一次模板审核被拒原因是包含变量${ip}后来改成「服务器${host}异常」才通过。建议首次申请选择「验证码」类模板通过率更高。3. 告警脚本开发实战3.1 脚本目录配置首先确认Zabbix脚本路径查看配置文件grep AlertScriptsPath /etc/zabbix/zabbix_server.conf如果未设置添加以下配置路径可自定义AlertScriptsPath/usr/lib/zabbix/alertscripts3.2 Python脚本示例阿里云版创建/usr/lib/zabbix/alertscripts/sms_aliyun.py#!/usr/bin/python3 import sys import json from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest def send_sms(phone, content): client AcsClient(你的AccessKeyId, 你的AccessKeySecret, cn-hangzhou) request CommonRequest() request.set_accept_format(json) request.set_domain(dysmsapi.aliyuncs.com) request.set_method(POST) request.set_protocol_type(https) request.set_version(2017-05-25) request.set_action_name(SendSms) request.add_query_param(PhoneNumbers, phone) request.add_query_param(SignName, 你的签名) request.add_query_param(TemplateCode, 你的模板ID) request.add_query_param(TemplateParam, json.dumps({content: content})) response client.do_action_with_exception(request) return response.decode(utf-8) if __name__ __main__: phone sys.argv[1] message sys.argv[2] print(send_sms(phone, message))3.3 Shell包装脚本创建/usr/lib/zabbix/alertscripts/zabbix_sms.sh处理中文编码#!/bin/bash # 接收参数手机号 主题 内容 PHONE$1 SUBJECT$2 CONTENT$3 # 转码防止中文乱码 ENCODED_CONTENT$(echo $CONTENT | iconv -f UTF8 -t GB2312//TRANSLIT) # 调用Python脚本 python3 /usr/lib/zabbix/alertscripts/sms_aliyun.py $PHONE $ENCODED_CONTENT给脚本执行权限chmod x /usr/lib/zabbix/alertscripts/*4. Zabbix控制台配置4.1 创建告警媒介类型进入「管理」→「告警媒介类型」→「创建媒介类型」关键配置名称SMS_ALIYUN类型脚本脚本名称zabbix_sms.sh脚本参数每行一个{ALERT.SENDTO} {ALERT.SUBJECT} {ALERT.MESSAGE}4.2 用户告警设置为用户添加告警媒介进入「用户」→「报警媒介」→「添加」配置接收手机号和触发条件类型SMS_ALIYUN收件人13800138000实际手机号时间00:00-24:00严重性灾难-警告4.3 动作配置示例创建触发动作操作配置默认接收人故障{TRIGGER.STATUS}默认信息主机{HOST.NAME} 问题{TRIGGER.NAME} 时间{EVENT.DATE} {EVENT.TIME} 等级{TRIGGER.SEVERITY} 详情{ITEM.NAME}{ITEM.VALUE}恢复操作勾选「恢复操作」消息模板故障已恢复5. 生产环境调优经验5.1 频率限制策略为避免短信轰炸建议在短信平台设置流控如1条/分钟在Zabbix动作中设置「步骤持续时间」为30分钟使用「告警升级」功能不同级别通知不同人员5.2 日志排查技巧查看脚本执行日志tail -f /var/log/zabbix/zabbix_server.log常见错误码阿里云isv.BUSINESS_LIMIT_CONTROL触发流控isv.AMOUNT_NOT_ENOUGH余额不足腾讯云1014签名无效1016手机号格式错误5.3 高可用方案我们给某银行设计的双通道方案主备短信平台自动切换失败消息写入Redis队列重试每周生成送达率报表6. 进阶模板化告警内容通过宏变量实现动态内容【{TRIGGER.SEVERITY}】{HOST.NAME}发生{TRIGGER.NAME}故障 当前值{ITEM.VALUE1} 阈值{ITEM.VALUE2}效果示例【严重】MySQL主库连接数超限 当前值985 阈值8007. 特别注意事项安全防护将AccessKey存储在/etc/zabbix/zabbix_server.conf中设置脚本目录权限为750chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts成本控制非核心业务使用「聚合告警」功能设置夜间免打扰时段如23:00-7:00合规要求短信模板必须通过平台审核保留6个月以上的发送记录记得第一次上线时我们因为没设置流控半夜一个磁盘告警发了200多条短信差点把当月预算用完。现在团队里还流传着「短信刺客」的梗这也让我们更重视告警策略的精细化配置。