環境変数ではコマンド置換は機能しません。

環境変数ではコマンド置換は機能しません。

このコマンドがありますが、これを変更したいと思います。特に、環境変数に応じて最新のパラメータが存在したいと思います。

ansible-playbook --inventory inventories/ssg-dev deploy.yml --vault-id dev@~/ansible-password --skip-tags "clear-data"

私の試みは次のとおりです。

ansible-playbook --inventory inventories/ssg-$ENVIRONMENT deploy.yml --vault-id $ENVIRONMENT@~/ansible-password $( [ $DATA_SCHEMAS_MIGRATION == true ] && echo ' --skip-tags "clear-data"')

環境変数を設定し、echobeforeを使用してコマンドを実行して出力を確認すると、元のコマンドとまったく同じです。しかし、実行してみると引数が渡されないようで、コマンド置換で環境変数が評価されないと信じられます。

私のコードがうまくいかないのはなぜですか、どうすれば解決できますか?

答え1

clear-data一重引用符のため、周囲の二重引用符は評価されません。これは予想されたものとは異なる"clear-data"主張につながります。clear-data

この試み:

ansible-playbook --inventory "inventories/ssg-$ENVIRONMENT" deploy.yml --vault-id "$ENVIRONMENT@~/ansible-password" $([ "$DATA_SCHEMAS_MIGRATION" = true ] && echo '--skip-tags clear-data')

$ENVIRONMENTグロービングと単語の分離を防ぐために二重引用符も追加しました$DATA_SCHEMAS_MIGRATION

答え2

変数からコマンドラインを設定するときは、配列を使用するのが最善です。これは、スカラー変数を使用しようとしたときに直面する一重引用符、二重引用符、および引用符なしの変数の使用と結合に関連するほとんどすべてのトークン化の問題やその他の手間を排除します。

配列を使用すると、コードがより明確で読みやすく、修正が容易になります。パラメータと条件の多い長く複雑な行を変更する代わりに、各行に1つ以上のパラメータを追加して複数の行に分割できます。 )

コマンドで使用したいすべてのパラメータを含む配列を構築し(一度にすべて実行することも、追加で実行することも、必要に応じて+=条件および/またはループを使用することもできます)、次のコマンドを使用します。実行します。配列のすべての要素を引数として使用します。

たとえば、

ap_args=(--inventory "inventories/ssg-$ENVIRONMENT" deploy.yml)
ap_args+=(--vault-id "$ENVIRONMENT@~/ansible-password")
[ "$DATA_SCHEMAS_MIGRATION" == true ] && ap_args+=(--skip-tags clear-data)

ansible-playbook "${ap_args[@]}"

また、変数を引用することを忘れないでください。バラよりスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?そして$VAR対${VAR}と引用

また、見ることができます変数に保存されたコマンドをどのように実行できますか?

注:アレイには、それをサポートする、、、bashまたはksh他のシェルが必要です。zshPOSIX sh(例:ash/ dash)はそうではありません。

関連情報