이 문제를 해결하는 방법을 아는 사람이 있나요?
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 '...'"
.
감사해요