24時間365日フルマネージドホスティングサービスのデイーネット

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

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

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

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar