Ansible ad-hoc コマンド出力を実行して生成された awk コマンドを提案する必要がある

Ansible ad-hoc コマンド出力を実行して生成された awk コマンドを提案する必要がある

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ただし、出力でシェルコマンド()を実行しようとすると、awkAnsibleはヘルプメニューを表示します。

$ 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}'\'''

これはシェルを表す3つの単語なので、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 }'

関連情報