このコマンドがありますが、これを変更したいと思います。特に、環境変数に応じて最新のパラメータが存在したいと思います。
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"')
環境変数を設定し、echo
beforeを使用してコマンドを実行して出力を確認すると、元のコマンドとまったく同じです。しかし、実行してみると引数が渡されないようで、コマンド置換で環境変数が評価されないと信じられます。
私のコードがうまくいかないのはなぜですか、どうすれば解決できますか?
答え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
他のシェルが必要です。zsh
POSIX sh
(例:ash
/ dash
)はそうではありません。