有人知道如何解决这个问题吗?
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 '...'"
。
谢谢