Alguém sabe como resolver este problema?
ansible -m shell -i test.txt -a "sudo find / -regex '.*\(tar\|zip\)$' -type f 2>/dev/null | while read i; do echo $i; done"
O problema é a parte "enquanto". Não apresenta nenhum resultado. Quando eu executo diretamente no Bash, tudo está OK.
(Preciso dessa parte "while", pois faço várias operações com arquivos encontrados pelo find
, like unzip
e grep
)
obrigada
Como
$i
ocorre entre aspas duplas, ele será expandido (para nada) antes de ser passadoansible
como parte da string de comando. Você precisa escapar disso:... do echo \$i; ...
.BTW, você deve tecnicamente fazer o mesmo com as barras invertidas e
$
isso faz parte da expressão regular, como'.*\\(tar\\|zip\\)\$'
. Você realmente não precisa, já que os caracteres depois deles são aqueles que não podem ser interpretados como sequências de escape ou$
expansões, então o shell os deixará em paz, mas usar uma sintaxe que "simplesmente funciona" sempre me faz nervoso.Em relação à primeira resposta, escapando
$i
para\$i
deixar rodar corretamente.Em vez de usar
sudo
dentro dos argumentos do shell,--become
pode ser uma abordagem melhor.Em relação a
até onde eu entendo o
shell
módulo Ansible, ele está fazendo algo como/bin/sh -c
. Se um Bash for necessário, você pode usá-lo no exemplo via--args "/bin/bash -c '...'"
.Graças a
raw
eshell
command
shell
ecommand
no Ansiblesh
ebash