Ansible カンマ(,)を区切りでなく文字列として扱う方法

Ansibleを使っていてカンマ(,)を区切りでなく文字列として扱う方法に関する情報です。

 

最初、カンマが区切り文字扱いになってしまい、正常のWindowsサーバ側へコマンドが渡せませんでした。

 

そこで参考になったのがこちらのサイトです。

https://de-vraag.com/ja/67372191

 

以下は質問の抜粋です。

===

Ansibleで特殊文字を含むパスワードに対処する
ansible_ssh_pass オプションを使用して ansible playbook を実行し、接続先サーバーに接続しようとしています。

 

ansible-playbook test-playbook.yml -i hosts -u daniel --extra-vars "{"ansible_ssh_pass":"u5!vuL!<35Lf?<>n'x"}"


問題は、パスワードに特殊文字が含まれていることです。 使って保存してみました。

 

"password\'s"
"password"
"\"password\""

 

どうすればパスワードを保存できますか?

===

 

 

以下は回答です。

 

===

おそらく少し遅いですが、あなたの具体的な問題に対する正確な解決策は。

ansible-playbook test-playbook.yml -i hosts -u daniel --extra-vars ansible_ssh_pass=$'"u5!vuL!<35Lf?<>n\'x"'
シェルは $'<string>' を特別に扱い、中のシングルクォートをエスケープします (バックスラッシュを参照してください)。

一番外側の二重引用符は、jinja2テンプレートエンジンがansible内部で混乱しないようにするために必要です。

とはいえ、少なくとも2つの理由から、このようなコマンドを実行するのはかなりまずいです。

それは安全ではありません。マシンのプロセス一覧やシェル履歴にアクセスできる人なら、誰でもパスワードを見ることができます。
柔軟性がない。Ansible はコマンドラインで提供される追加変数が最も優先されます。もし、インベントリに別のホストを追加して、異なる ssh パスワードを設定した場合、2つのパスワードを区別することはできません。
最初の問題については、もしマシンが1台しかない(あるいはどこでも同じパスワード)ことが確実なら、例えば vars_prompt を使って対話的にパスワードを尋ねることができます (http://docs.ansible.com/ansible/latest/user_guide/playbooks_prompts.html)

両方の問題を解決する最善の方法は、データ保管庫の暗号化を使用したパスワードを特定のホストのインベントリに追加することです。その後、プレイブックを呼び出す際に、データ保管庫全体のパスワードを対話的に (--ask-vault-pass) または安全性の高いデータ保管庫パスワードファイル (--vault-password-file=) を通して提供するのです。

===

 

こちらの環境だと、with_itemsループを使っていて、""シングルコートで囲むことで動作しました。

 

'" {{ item.list1 }} "'

with_items: "{{ itemname  }}"

 

Ansible実践ガイド 第3版 impress top gearシリーズ