Ansible の template モジュールで with_fileglob を使う

スポンサーリンク

このエントリは 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_fileglobtemplates ディレクトリではなく files ディレクトリを見にいく。そのため、テンプレートファイルを files ディレクトリ配下に置く必要が出てくるが、これはちょっと気持ち悪い。

その2: ファイル名の問題

テンプレートファイルを files ディレクトリに置いたとしても、テンプレートが対象ホストで展開されるときに、展開後のファイル名に拡張子 .j2 がそのまま付いてしまう。そのため、テンプレートファイルのファイル名に .j2 という拡張子を付けられない。これも気持ち悪い。

解決策

ググったらそのものずばりの解決策があった。

まず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 明日の担当は…… まだ埋まってません。 (`・ω・´)

コメント

  1. n.t より:

    すいません。Squidについてわからないことがあるんですが、
    どうすれば、youtubeの動画をキャッシュ(PCに保存)して何度も読み込まなくてよくなるでしょうか?
    それと、googleの画像のページでキャッシュして画像読み込みを削減できるでしょうか?
    そのsquid.confの設定がわかりません。

  2. n.t より:

    それとwindows10でsquidをインストールしましたが。
    よくわからないところがあり不明でございます。
    コマンドが間違っているせいかなぜかsquidの
    サービスがストップしてしまいます。わかりましたらコメントお願いします。squid.conf↓
    http://fast-uploader.com/file/7024312816606/
    パスワード:1234
    メールでも大丈夫です。

タイトルとURLをコピーしました