二つ以上渡す
ansibleでは、
--extra-varsを使えば、実行時に、引数を渡すことができます。
また、これは、set_factや、varsなどで設定する変数を全て上書くことができます。
また、実行時に変数を渡すことができるので、既存のansibleを普段とは別の使い方をしたい場合にも活用できます。
書き方としては、公式ページに以下のように記載があります。
Values passed in using the key=value syntax are interpreted as strings. Use the JSON format if you need to pass non-string values such as Booleans, integers, floats, and lists.
ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
ですが、渡らない という状況にハマりました。
状況としては、以下です。
・jenkins pipelineを使って、pythonのコードを呼び出し、そのpythonから、ansible-playbook ****.yml --extravars "XXX=A YYY=B"
を実行する(公式ドキュメントにある半角スペースで区切る方法)
・jenkinsのコンソール上には、上記のextra-varsをつけたコマンドが表示されているが、実行されたansible_hr.logを見ると値が渡っていない。
・ローカルで実行した際は、公式の記述のように、一つのextra-varsに対して、スペース区切りで二つ渡せば実行できた。
なぜ
試したこと
・jsonの記述にしてみる。
公式には以下の記法もありこちらも試してみましたがダメでした。
ansible-playbook release.yml --extra-vars '{"version":"1.23.45","other_variable":"foo"}'
ansible-playbook arcade.yml --extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'
・エスケープ文字を足す。
エスケープ文字を足して実行。同じくダメでした。
--extra-vars \"AAA=true BBB="${CCC}"\"
結論
以下でできました。シンプルですね。
【--extra-varsを2個つける】
ansible-playbook ****.yml --extra-vars "XXX=A" --extra-vars "YYY=B"
pythonから呼び出した、あるいは、 jenkinsとpythonの両方を経由した、などが関係して、読み込めなくなっていたのかもしれません。
また、以下の記法もできるようでした。
ansible-playbook ****.yml -e "XXX=A" -e "YYY=B"
ドキュメントに無いけれど。
なぜこれで解決したのか?
原因の詳細は不明ですが、Jenkins ➔ Python ➔ Shell という複数の階層を経由する際、引数のクォートの解釈やスペースのパースが崩れてしまい、一つの大きな文字列として誤認されたり、逆に分割されすぎたりした可能性があります。
引数を分けて指定することで、各環境(Jenkins/Python)の引数パーサーが「どこまでが一つのオプションか」を明確に判別できるようになり、確実にAnsibleへ変数が届くようになったと考えられます。
実はこれは結構昔に下書きした記事なのですが、やっぱり根本原因は不明なので、このまま投稿することにしました。
以上、読んでいただきありがとうございました。