如何检测Ansistrano Deploy部署结果以发送Slack通知
获取Ansistrano部署执行状态的实现方案
直接用Ansible原生的block+rescue+always语法即可实现全状态捕获,不需要修改Ansistrano角色源码,能覆盖所有成功、失败场景,具体实现如下:
- 调整原有角色调用方式
不要把ansistrano.deploy直接写在playbook的顶级roles列表中,改为在任务块中通过include_role调用,方便捕获角色内部所有任务的执行结果:
- name: 执行生产环境部署 hosts: app_servers gather_facts: true vars: # 此处保留原有Ansistrano配置参数即可 ansistrano_deploy_to: "/var/www/myapp" ansistrano_git_repo: "git@yourgithost:myapp/repo.git" tasks: - block: - name: 执行Ansistrano部署流程 include_role: name: ansistrano.deploy - set_fact: deploy_final_status: "成功" deploy_fail_reason: "" rescue: - set_fact: deploy_final_status: "失败" deploy_fail_reason: "{{ ansible_failed_result.msg | default('未捕获到明确错误信息') }}" always: - name: 发送Slack部署通知 # 此处替换为实际使用的Slack通知模块调用逻辑 debug: msg: "本次部署{{ deploy_final_status }},异常信息:{{ deploy_fail_reason | default('无') }}"
方案逻辑说明
block块内放置核心部署逻辑,只要Ansistrano角色中任意任务执行失败,会直接跳转到rescue块执行状态标记rescue块专门负责捕获所有部署阶段的异常,记录失败原因always块无论部署成功还是失败都会强制执行,在这里统一写Slack通知逻辑,直接引用提前标记的状态变量即可,不会出现漏通知的情况
可选优化:结合内置钩子细化状态感知
如果需要更细粒度的部署阶段感知,可以直接使用Ansistrano自带的钩子变量插入自定义逻辑,不需要修改角色源码:- 部署流程走到软链接切换完成(即核心部署动作成功)时,会自动执行你定义在
ansistrano_after_symlink_tasks列表里的任务 - 部署前、代码拉取后、共享文件同步后等各个阶段都有对应钩子变量,可以按需插入状态打点逻辑
- 部署流程走到软链接切换完成(即核心部署动作成功)时,会自动执行你定义在
不建议通过ansible-playbook命令的进程退出码判断状态:这种方式只能在playbook执行完全结束后在外部脚本层判断,没法在Ansible流程内直接联动后续通知动作,可靠性低于playbook内置的块结构捕获方案。
内容的提问来源于stack exchange,提问作者99miles
相关产品推荐
相关产品推荐

