Ansible 2.9:判断Tomcat安装状态后如何继续执行剧本剩余任务
问题根因和修复方案
核心错误点
- 条件判断类型不匹配:Ansible中
shell模块返回的rc状态码是整数类型,你代码中写的tomcatExists.rc == "1"是和字符串"1"匹配,条件永远不成立,因此安装任务被直接跳过。 - 检测命令逻辑错误:你在shell命令末尾加了
echo $?,无论前面grep是否匹配成功,整个命令的最终返回码永远是echo执行成功的0,完全无法获取grep的真实匹配结果。 - 终止任务配置错误:
meta: end_play被写在了debug任务的参数层级,不会生效,需要单独作为一个任务执行才能终止当前剧本。
修正后代码
1. 检测与调用逻辑(替换你原来的插入代码)
推荐使用Ansible原生的stat模块做目录检测,更稳定可靠:
- name: 检测指定版本Tomcat是否已安装 stat: path: "/opt/tomcat/{{ newTomcatVer }}" register: tomcatExists - block: - name: 调用独立Tomcat安装剧本 include_tasks: installTomcatOnly.yaml # 仅当指定版本目录不存在时触发安装 when: not tomcatExists.stat.exists
如果一定要保留shell检测的写法,调整如下:
- name: 检测指定版本Tomcat是否已安装 shell: ls -l /opt/tomcat/ 2>/dev/null | grep "[ ]\+{{ newTomcatVer }}$" register: tomcatExists failed_when: false changed_when: false - block: - name: 调用独立Tomcat安装剧本 include_tasks: installTomcatOnly.yaml # 注意rc是整数,不需要加引号 when: tomcatExists.rc == 1
2. installTomcatOnly.yaml 修正
将meta: end_play拆分为独立任务:
--- - name: 安装剧本触发提示 debug: msg: "This message is from another PLAYBOOK" # 单独作为任务执行,终止当前父剧本的所有后续任务 - name: 安装完成后终止父剧本执行 meta: end_play
内容的提问来源于stack exchange,提问作者kamokoba
相关产品推荐
相关产品推荐

