![Ansible ad-hoc 명령 출력을 실행하여 생성된 awk 명령을 제안해야 함](https://linux55.com/image/198620/Ansible%20ad-hoc%20%EB%AA%85%EB%A0%B9%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EC%97%AC%20%EC%83%9D%EC%84%B1%EB%90%9C%20awk%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%A0%9C%EC%95%88%ED%95%B4%EC%95%BC%20%ED%95%A8.png)
Ansible ad-hoc 명령을 사용하여 다음 명령을 실행하여 인덱스 ID를 찾으면:
$ ansible oamvip -i /storage/inventory/None/${myvnf}hosts --become -m shell -a "/usr/sbin/aladmin list | grep "PartitionUsage" | awk '{ print \$2 }'"
xxx.xx.xxx.xxx | CHANGED | rc=0 >>
4818b4715eb6542838023
e520bec15eb6542838023
sh
그러나 출력에서 셸 명령( )을 실행하려고 하면 awk
Ansible이 도움말 메뉴를 표시합니다.
$ ansible oamvip -i /storage/inventory/None/${myvnf}hosts --become -m shell -a "/usr/sbin/aladmin list | grep "PartitionUsage" | awk '{ print "aladmin show " \$2 | "sh"}'"
Usage: ansible <host-pattern> [options]
작은 따옴표, 큰 따옴표, 백슬래시를 시도했지만 아무 소용이 없습니다. 조언해주세요.
답변1
"/usr/sbin/aladmin list | grep "PartitionUsage" | awk '{ print \$2 }'"
전체 명령줄을 구문 분석하는 쉘의 관점에서 이것은 단지 문자열(단어)일 뿐입니다. 나는 그것이 귀하의 질문과 무관하게 전달되었다고 가정 sh -c
합니다.
"/usr/sbin/aladmin list | grep \"PartitionUsage\" | awk '{ print \$2 }'"
또는
"/usr/sbin/aladmin list | grep PartitionUsage | awk '{ print \$2 }'"
대신에.
set -x
: "/usr/sbin/aladmin list | grep "PartitionUsage" | awk '{ print "aladmin show " \$2 | "sh"}'"
+ : '/usr/sbin/aladmin list | grep PartitionUsage | awk '\''{ print aladmin' show ' $2 | sh}'\'''
이는 쉘을 나타내는 세 단어이므로 ansible
쉘은 이러한 매개변수를 이해하지 못합니다.
또 그거 "
.
awk '{ print "aladmin show " \$2 | "sh"}'
되어야 한다
awk '{ print \"aladmin show \" \$2 | \"sh\"}'
그런데
(거의 일반적이지만 특히 이 경우) 이유 없음
... | grep ... | awk ...
파이프라인은 (PCRE와 같은 몇 가지 예외를 제외하고) 할 수 있는 awk
모든 작업을 수행할 수 있습니다 grep
.
grep PartitionUsage | awk '{ print \$2 }'
=>
awk '/PartitionUsage/ { print \$2 }'