べにやまぶろぐ

技術寄りの話を書くつもり

Ansible でファイル内に変数を使う場合は copy ではなく template で。

バージョン : 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 分けて変数も入れてしまうくらいで丁度良いように思います。