Ansible可通过自定义dingtalk.py回调插件结合钉钉Webhook实现部署耗时与报错实时通知,核心是捕获v2_runner_on_ok等事件、构造Markdown消息并用requests.post推送,需配置callback_plugins路径及whitelist,推荐加签认证并做好异常容错。

Ansible 本身不直接支持钉钉推送,但可通过自定义 callback 插件 + 钉钉 Webhook 实现部署耗时与报错的实时通知。核心是捕获任务事件(如 v2_runner_on_ok、v2_runner_on_failed),组装结构化消息,用 requests.post() 推送至钉钉机器人地址。
准备钉钉 Webhook 地址
在钉钉群中添加「自定义机器人」,开启「加签」或「IP 白名单」(推荐加签更安全)。复制生成的 Webhook URL,例如:https://oapi.dingtalk.com/robot/send?access_token=xxx
若启用加签,需在插件中计算时间戳+密钥签名,否则只需 URL 即可发送。
编写轻量级钉钉 callback 插件
新建文件 callback_plugins/dingtalk.py,内容如下(兼容 Ansible 2.12+,含基础错误防护):
- 继承
CallbackBase,重写关键事件方法 - 对
failed、unreachable、error等状态构造高亮告警消息 - 提取任务名、主机名、执行耗时(
result._elapsed)、stdout/stderr 片段(截取前 300 字,防超长) - 使用
requests发送 Markdown 消息,支持加签逻辑(附带时间戳和签名头)
配置 Ansible 启用该插件
在项目根目录或 ~/.ansible.cfg 中添加:
- 指定插件路径:
callback_plugins = ./callback_plugins - 启用插件:
callback_whitelist = dingtalk - (可选)通过环境变量传入钉钉 token 或密钥,避免硬编码:
export DINGTALK_WEBHOOK="https://..."
注意:不要同时启用多个输出类插件(如 json 或 yaml),避免 stdout 冲突;如需保留本地日志,建议让插件只负责推送,不接管标准输出。
验证与调优要点
运行 playbook 后观察钉钉群是否收到消息,并检查以下细节:
- 失败任务是否带红色 emoji 和完整错误摘要(非堆栈全量)
- 耗时字段是否准确(Ansible 2.15+ 支持
_elapsed,旧版本需自行计时) - 同一任务多次重试是否避免重复推送(可在插件内加简单去重缓存,如基于 task_id + host 的 60 秒内存缓存)
- 网络异常时插件应静默失败,不中断 playbook 执行(用
try/except requests.RequestException包裹)
不复杂但容易忽略











