AnsibleでJinja2テンプレートエンジンを使おう

こんにちは。構築担当の下地です。

今日はAnsibleの話をしようと思います。

宜しくお願いします。

Templateモジュールで設定ファイルを設置する

サーバ構築を行う際に避けて通れないのがミドルウェアの設定ですが、その際に設定ファイルを新規作成する場合があります。

例えばApahceを導入してバーチャルホストを切りたいなら、conf.dディレクトリにバーチャルホスト用の設定ファイルを設置したりします。

その際に、AnsibleではTemplateモジュールを使って、事前にAnsibleサーバに保管してある設定ファイルをターゲットホストに送って設置することができます。

  • テンプレートファイル
Listen 80
NameVirtualHost *:80
<virtualhost *:80>
ServerName virtualexample1.com
DocumentRoot /var/www/vhosts/virtualexample1.com
</virtualhost>
  • playbookファイル
- name: VirtualHost用confファイルを設置する
template:
src: templates/virtualhost.conf
dest: /etc/httpd/conf.d/virtualhost.conf

こんな感じで書きます。

srcがAnsibleサーバ側に保管してある設定ファイルで、これをターゲットホストに

/etc/httpd/conf.d/virtualhost.conf

として設置します。

また、このテンプレートファイルに変数を組み込むこともできます。

色々と使い勝手は良いですが、ここでバーチャルホストを3つ切りたい、となったらどうするでしょうか?

あらかじめテンプレートファイルに3つ分のバーチャルホスト設定を書いておいても良いですが、少しかっこ悪いですね。

  • 力技テンプレートファイル
Listen 80
NameVirtualHost *:80
<virtualhost *:80>
ServerName virtualexample1.com
DocumentRoot /var/www/vhosts/virtualexample1.com
</virtualhost>
<virtualhost *:80>
ServerName virtualexample2.com
DocumentRoot /var/www/vhosts/virtualexample2.com
</virtualhost>
<virtualhost *:80>
ServerName virtualexample3.com
DocumentRoot /var/www/vhosts/virtualexample3.com
</virtualhost>

また、いつも事前にバーチャルホストの数が分かるとは限りません。

バーチャルホスト30個きりたい、という場合はこの記述を30個分書いておく必要があります。

そういう場合にjinja2を使います。

jinja2テンプレートエンジンでループ処理

jinja2とは、python用のテンプレートエンジンライブラリの1つです。

名前の由来は、テンプレート→テンプル→神社、らしい(マジスカ)

コレを使ってテンプレートファイルにループ処理を組み込みます。

  • ループ入りテンプレートファイル
Listen 80
NameVirtualHost *:80
{% for n in httpd_virtualhostname %}
<VirtualHost *:80>
ServerName {{ n.hostname }}
DocumentRoot {{ n.vars.0 }}
 CustomLog {{ n.vars.1 }} combined </VirtualHost> {% endfor %}

こんな感じでforを使ってループ処理を組み込みます。

変数の部分は以下のように別ファイルで用意して、そこから参照しています。

  • 変数ファイル
httpd_virtualhostname:
- hostname: virtualexample1.com
vars:
- /var/www/vhosts/virtualexample1.com
- /var/www/vhosts/virtualexample1.com/LOG
- hostname: virtualexample2.com
vars:
- /var/www/vhosts/virtualexample2.com
- /var/www/vhosts/virtualexample2.com/LOG

変数はリスト形式とディクショナリ形式を織り交ぜて、宣言と代入をしています。

もっとスマートな書き方があるかもしれません。

playbookはtemplateモジュールで指定するsrcファイルを変えるだけです。

通常は拡張子を.j2で作成します。

  • playbook
- name: VirtualHost用confファイルを設置する
template:
src: templates/virtualhost.conf.j2
dest: /etc/httpd/conf.d/virtualhost.conf

これで実行すると、ターゲットホストに以下の設定ファイルが設置されました。

# cat /etc/httpd/conf.d/virtualhost.conf
Listen 80
NameVirtualHost *:80
<virtualhost *:80>
ServerName virtualexample1.com
DocumentRoot /var/www/vhosts/virtualexample1.com
CustomLog /var/www/vhosts/virtualexample1.com/LOG combined
</virtualhost>
<virtualhost *:80>
ServerName virtualexample2.com
DocumentRoot /var/www/vhosts/virtualexample2.com
CustomLog /var/www/vhosts/virtualexample2.com/LOG combined
</virtualhost>

ちゃんとループが働いて想定どおりの設定ファイルが作成されました。

まとめ

Ansibleを使ってターゲットホストに色々構築する場合は、設定ファイルの修正や新規作成は避けて通れない処理になります。

その際に、このような仕組みを使うとよりきれいなコードで実装できるかと思います。

お読みいただきありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA