こんにちは。構築担当の下地です。
今日は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を使ってターゲットホストに色々構築する場合は、設定ファイルの修正や新規作成は避けて通れない処理になります。
その際に、このような仕組みを使うとよりきれいなコードで実装できるかと思います。
お読みいただきありがとうございました。