Ansible:强制执行pipefail

时间:2015-10-23 14:29:44

标签: bash shell error-handling pipe ansible

今天早些时候,我们遇到了由以下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 pipefailset -e。是否可以在ansible中执行此操作,最好是全局执行shell命令?

1 个答案:

答案 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