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 }}"
![]() |