今天早些时候,我们遇到了由以下shell管道引起的令人讨厌的问题:
- name: get remote branches
shell: git ls-remote -h git@bitbucket.org:orga/repo.git | sed 's_.*refs/heads/__g'
register: branches_remote
git
命令失败,但整个管道的返回码为0. This is default bash/sh behavior。
要解决此问题,请在sh / bash中set -o pipefail
或set -e
。是否可以在ansible中执行此操作,最好是全局执行shell
命令?
答案 0 :(得分:4)
一般情况下,您应该尝试使用shell命令作为最后的手段,因为它们往往有点脆弱。如果您需要将shell模块与任何shell选项一起使用,只需将其作为命令管道的一部分提交,如下所示。可执行参数强制使用bash shell。
[user@ansible ~]$ ansible myhost -m shell -a "executable=/bin/bash set -o pipefail && false | echo hello there"
myhost | FAILED | rc=1 >>
hello there
[user@ansible ~]$ ansible myhost -m shell -a "executable=/bin/bash set -o pipefail && true | echo hello there"
myhost | success | rc=0 >>
hello there