Ansibleで特殊文字(テンプレート変数を示す{}とか、コメントの#やYAMLの:等)を通す場合のメモ
Playbookでテンプレ変数にパスワードが設定されていればそれをパスワードにして、それ以外の時はurandomからmd5でパスワード生成するという処理を書くときにはまって調べた。
色々試行錯誤した結果、
1 2 3 4 5 6 |
PASS='{{ defined_password }}'; if [ 0 -gt ${{ '{#PASS}'}}];then echo ${PASS}; else head -c 200 /dev/urandom | md5sum | sed -e 's/ .*//g'; fi |
{{ ‘特殊文字’ }}
と言う形式で記述するのが一番確実らしい。
この場合は、bashの文字列取得処理で${#PASS}を取りたかったんだけど、#がコメントアウト文字として認識されて切れちゃうので、まず#をエスケープする必要が出た。
デフォルトのhttpd.confのnamevirtualを有効化する場合とかは
1 2 3 4 5 6 7 8 9 10 |
- name: Config httpd lineinfile: dest=/etc/httpd/conf/httpd.conf state=present backrefs=yes regexp='{{ item.regexp }}' line='{{ item.line }}' with_items: - regexp: '^#NameVirtualHost \*{{ ":" }}80' line: 'NameVirtualHost *:80' |
こんな感じで、*はバックスラッシュエスケープして、:の方は{{}}くくりをする。
この辺はAnsible自体と言うより、Pythonとテンプレートエンジンを通して食べるために、各レイヤーをセーフに通れる表記をしないといけないのがちょい注意だね。
(17667)