Ansible -m shell 和 find 命令

Ansible -m shell 和 find 命令

有人知道如何解决这个问题吗?

ansible -m shell -i test.txt -a "sudo find / -regex '.*\(tar\|zip\)$' -type f 2>/dev/null | while read i; do echo $i; done"

问题出在“while”部分。它没有显示任何结果。当我直接在 Bash 中运行它时,一切就OK了。

find(我需要这个“while”部分,因为我对 、unzip和找到的文件进行各种操作grep

谢谢

答案1

由于出现在双引号中,因此在作为命令字符串的一部分$i传递之前,它将被扩展(为空) 。ansible你需要逃避它:... do echo \$i; ...

顺便说一句,从技术上讲,您应该对反斜杠执行相同的操作,$这是正则表达式的一部分,例如'.*\\(tar\\|zip\\)\$'.你真的不需要这样做,因为它们后面的字符恰好是不能被解释为转义序列或$扩展的字符,所以 shell 不会管它们,但使用“恰好有效”的语法总是让我紧张的。

答案2

关于第一个答案,转义$i\$i使其正确运行。

ansible test --user ${ACCOUNT} --ask-pass --become --module-name shell --args "find /home/{{ ansible_user }} -regex '.*\(tar\|zip\)$' -type f 2>/dev/null | while read i; do echo \$i; done"

而不是sudo在 shell 参数中使用,--become可能是一个更好的方法。

关于

当我直接在 Bash 中运行它时,一切就OK了。

据我了解 Ansibleshell模块,它正在做类似的事情/bin/sh -c。如果需要 Bash,您可以通过 示例使用它--args "/bin/bash -c '...'"

谢谢

相关内容