この問題を解決する方法を知っている人はいますか?
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で直接実行すると、すべてが正常です。
find
unzip
(、および見つかったファイルに対してさまざまな操作を実行するため、この「while」部分が必要ですgrep
。)
ありがとう
答え1
二重引用符内に表示されるため、$i
コマンド文字列の一部として渡される前に拡張(空)されます。ansible
エスケープする必要があります... do echo \$i; ...
。
しかし、技術的には、正規表現$
の一部であるバックスラッシュに対して同じことを行う必要があります(例:)。その後の文字はエスケープ定義シーケンスまたは拡張文字'.*\\(tar\\|zip\\)\$'
として解釈されないため、実際にはそうする必要はありません。$
したがって、シェルはこれを無視しますが、「ただ動作する」構文を使用すると常に不安になります。
答え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
シェルパラメータで使用する代わりに、--become
より良いアプローチになります。
~について
Bashで直接実行すると、すべてが正常です。
私がAnsibleを理解する限りshell
同様の作業を行うモジュールです/bin/sh -c
。 Bashが必要な場合は、例で使用できます--args "/bin/bash -c '...'"
。
ありがとう