当我使用 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
但是,当我尝试对输出结果执行 shell 命令 ( ) 时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 }'"
从解析整个命令行的 shell 的角度来看,这只是一个字符串(单词)。我假设它被传递到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}'\'''
这是 shell 的三个词,因此ansible
shell 不理解这些参数。
又是那个"
.
awk '{ print "aladmin show " \$2 | "sh"}'
必须成为
awk '{ print \"aladmin show \" \$2 | \"sh\"}'
顺便提一句
(几乎一般情况下,特别是在这种情况下)没有理由
... | grep ... | awk ...
pipeline as(除了 PCRE 等少数例外)awk
可以做所有grep
能做的事情。
grep PartitionUsage | awk '{ print \$2 }'
=>
awk '/PartitionUsage/ { print \$2 }'