このエントリは Ansible Advent Calendar 2015 の10日目です。
昨日の記事は shin1x1 さんの「OSX の開発環境を Ansible で自動構築する(El Capitan / Yosemite)」でした。
やりたいこと
Ansible の template モジュールを使って、同じディレクトリにある多数のテンプレートファイルをサーバ上に展開したい。例えば Apache の .conf ファイルなどを想定する。Ansible のファイル構成は Best Practice を前提とする。
具体的には、with_fileglob を使って次のような task を書きたい。
- name: put apache config files
template:
src={{ item }}
dest=/etc/httpd/conf.d/{{ item }}
with_fileglob:
- etc/httpd/conf.d/*.j2
しかしこの書き方にはいくつか問題がある。
問題点
その1: 配置ディレクトリの問題
ドキュメントにも書かれている通り、with_fileglob
は templates
ディレクトリではなく files
ディレクトリを見にいく。そのため、テンプレートファイルを files
ディレクトリ配下に置く必要が出てくるが、これはちょっと気持ち悪い。
その2: ファイル名の問題
テンプレートファイルを files
ディレクトリに置いたとしても、テンプレートが対象ホストで展開されるときに、展開後のファイル名に拡張子 .j2
がそのまま付いてしまう。そのため、テンプレートファイルのファイル名に .j2
という拡張子を付けられない。これも気持ち悪い。
解決策
ググったらそのものずばりの解決策があった。
- Deploying a folder of template files using ansible – serverfault
まず1つ目の問題点は、files
ディレクトリからの相対パスで templates
ディレクトリを指定することで解決する。つまり
with_fileglob:
- etc/httpd/conf.d/*.j2
ではなく
with_fileglob:
- ../templates/etc/httpd/conf.d/*.j2
のように記述すれば良い。
2つめの問題点は、テンプレートを展開するときにファイル名の末尾から .j2
を取り除くことで解決する。具体的には、filter 機能を使用して、
src={{ item }}
dest=/etc/httpd/conf.d/{{ item | basename | regex_replace('\.j2$','') }}
のように記述する。
最終的には次のようになる。
- name: put apache config files
template:
src='{{ item }}'
dest='{{ item | regex_replace("^\.\./templates","") | regex_replace("\.j2$","") }}'
with_fileglob:
- ../templates/etc/httpd/conf.d/*.j2
まとめ
Ansible の template
モジュールで with_fileglob
が使えるようになった。便利だね。
Advent Calendar 明日の担当は…… まだ埋まってません。 (`・ω・´)
コメント
すいません。Squidについてわからないことがあるんですが、
どうすれば、youtubeの動画をキャッシュ(PCに保存)して何度も読み込まなくてよくなるでしょうか?
それと、googleの画像のページでキャッシュして画像読み込みを削減できるでしょうか?
そのsquid.confの設定がわかりません。
それとwindows10でsquidをインストールしましたが。
よくわからないところがあり不明でございます。
コマンドが間違っているせいかなぜかsquidの
サービスがストップしてしまいます。わかりましたらコメントお願いします。squid.conf↓
http://fast-uploader.com/file/7024312816606/
パスワード:1234
メールでも大丈夫です。