バージョン : Ansible 1.5.5
小ネタ3連投で恐縮ですが、例えば Ansible で Nginx 入れるよってとき nginx.conf を下記のように配置していたわけです。
- copy: src="templates/nginx/nginx.conf" dest="/etc/nginx/nginx.conf" owner=nginx group=nginx
で、ローカルと共用環境で nginx.conf の中身変えたいな〜なんて思って、例えば先ほどのエントリー『サブディレクトリを切って Jenkins さんを走らせるときは JENKINS_ARGS の確認を忘れずに。 - べにやまぶろぐ』 で書いた Jenkins おじさんの向き先を
upstream jenkins { server {{ jenkins_ip }}:{{ jenkins_port }}; }
とか書いて、inventory file (例 hosts.local) の中で
[web-servers] 192.168.33.10 [web-servers:vars] user=vagrant jenkins_ip=127.0.0.1 jenkins_port=8080
とかしてみたんですが一向に展開されない。二重ブラケットのままでコンフィグエラーになって nginx さん立ち上がらない。
Playbook の方ではきちんと変数読まれるので何がおかしいんだと思ってディレクトリ構成変えたりあーだこーだで数時間悩んだんですが答えは至極簡単でした。
変数展開するようなファイルは copy ではなく template (http://docs.ansible.com/template_module.html) モジュールを使うこと。
ということで
- template: src="templates/nginx/nginx.conf" dest="/etc/nginx/nginx.conf" owner=nginx group=nginx
というようにしてめでたく変数が展開されてようやく通るようになりました。
同様に hosts.production とか用意してあげれば環境に応じて異なる設定で同じ Playbook を使い回せるようになります。もっとちゃんとしたレイアウト (http://docs.ansible.com/playbooks_best_practices.html) もあるようですが、小さい構成では inventory file 分けて変数も入れてしまうくらいで丁度良いように思います。