如何让Ansible的win_shell获取批处理正确返回码并触发任务失败?
解决Ansible win_shell/win_command无法获取批处理真实返回码的问题
我之前也遇到过一模一样的问题!其实根源在于有些批处理脚本(比如你用的jboss-cli.bat)并不会主动把内部执行命令的错误码传递出来,再加上Ansible的win_shell在处理cmd命令时的一些特性,就导致你拿不到真实的返回码。这里有几个亲测有效的解决办法:
1. 强制让批处理返回真实错误码
很多这类工具的bat脚本执行完核心命令后,要么没设置%errorlevel%,要么被后续的无关命令覆盖了错误码。你可以在命令末尾加上&& exit /b %errorlevel%,强制把最后一条命令的错误码作为整个cmd会话的返回码,这样Ansible就能捕获到真实的失败信号了。修改后的任务代码如下:
- name: undeploy application win_shell: "set nopause=true && F:/xyz/wildfly-8.2.0.Final/bin/jboss-cli.bat --connect controller=myhost.net --user=\"myuser\" --password=\"verysecret\" --command=\"deploy F:\warfolder\mywar.war --server-groups=main-server-group\" && exit /b %errorlevel%" args: executable: cmd
2. 改用win_command并显式校验返回码
win_command相比win_shell更轻量化,不会通过cmd解释器做额外的环境处理。你可以直接调用cmd.exe并传递命令参数,同时用failed_when显式指定任务失败的条件:
- name: undeploy application win_command: cmd.exe /c "set nopause=true && F:/xyz/wildfly-8.2.0.Final/bin/jboss-cli.bat --connect controller=myhost.net --user='myuser' --password='verysecret' --command='deploy F:\warfolder\mywar.war --server-groups=main-server-group' && exit /b %errorlevel%" register: deploy_result failed_when: deploy_result.rc != 0
这样只要批处理返回的错误码不为0,Ansible任务就会立即标记为失败,完全符合你的需求。
3. 结合输出内容双重校验
如果遇到极端情况——批处理返回码是0但实际命令执行失败(比如jboss-cli输出了错误信息但没设置错误码),你可以同时捕获命令输出,结合关键词来判断任务状态:
- name: undeploy application win_shell: "set nopause=true && F:/xyz/wildfly-8.2.0.Final/bin/jboss-cli.bat --connect controller=myhost.net --user=\"myuser\" --password=\"verysecret\" --command=\"deploy F:\warfolder\mywar.war --server-groups=main-server-group\"" args: executable: cmd register: deploy_result failed_when: deploy_result.rc != 0 or 'Failed' in deploy_result.stdout or 'Error' in deploy_result.stderr
这种方式能最大程度避免误判,确保只要部署过程有问题,任务就会失败。
内容的提问来源于stack exchange,提问作者user1240018
相关产品推荐
相关产品推荐

