Ansible: template モジュールを使って nginx の バーチャルホスト設定
先日まとめたAnsible の Files モジュール群を見ていて、 そういえば template モジュールをあまりちゃんと使っていなかったなぁ、と思いました。 そんなわけで、軽く勉強がてらに記事にします。
https://blog.tacck.net/archives/15
前置き
template を適用するシーンは?
「同じようなことを一部だけ変えながら」作業する、というシーンで使えそうです。 今回は、nginx でバーチャルホスト設定をする想定で進めていきましょう。
環境
nginxを手っ取り早く動かすために、Vagrant + VirtualBox + Ubuntu で環境を作ります。 利用したVagrantfile
は下記となります。
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "private_network", ip: "192.168.33.10"
end
テンプレートエンジン
世の中にはテンプレートエンジンは数多あると思いますが、Ansibleで使えるのは Jinja2 というものです。
書き方は、こちらを参照してみてください。
Ansible template モジュールを使ってみる
nginx でバーチャルホスト利用する設定
Ansibleコマンドを実行するマシンで、OSのhosts
ファイルに下記を追加します。 私はmacOSなので、/etc/hosts
ファイルを修正。
192.168.33.10 sample1
192.168.33.10 sample2
192.168.33.10 sample3
ホスト2台として設定
下記のPlaybookファイルを作成します。 vars
のhosts
に、動作させたいサーバ名を記載しています。 今回は、sample1
とsample2
だけを記載しておきます。
- hosts: all
vars:
hosts:
- { name: sample1 }
- { name: sample2 }
tasks:
- name: install nginx
apt:
name: nginx
update_cache: yes
state: latest
- name: mkdir document root
file:
path: /var/www/{{ item.name }}
state: directory
mode: 0755
with_items:
"{{ hosts }}"
- name: put vhost config
template:
src: vhost.conf.j2
dest: /etc/nginx/sites-enabled/vhost.conf
register:
vhost_stat
- name: put index.html
template:
src: index.html.j2
dest: /var/www/{{ item.name }}/index.html
with_items:
"{{ hosts }}"
- name: start nginx
service:
name: nginx
state: restarted
when: vhost_stat.changed
バーチャルホストの設定となる、nginx用のテンプレートファイルを下記のように作成します。
{% for host in hosts %}
server {
listen 80;
server_name {{ host.name }};
access_log /var/log/nginx/{{ host.name }}.access.log;
location / {
root /var/www/{{ host.name }};
index index.html index.htm;
}
}
{% endfor %}
こちらは、動作確認用のHTMLファイル。これもテンプレートとして作成します。
Hello {{ item.name }} !
最後に、 Ansible 用のインベントリファイルを作成します。 Vagrant 向けの設定を書き込んでおく感じです。
[nginx-server]
server1 ansible_host=192.168.33.10
[nginx-server:vars]
ansible_user=vagrant
ansible_become=yes
実行 その1
では、実行してみましょう。
$ ansible-playbook -k -i hosts playbook.yml
SSH password:
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
paramiko: The authenticity of host '192.168.33.10' can't be established.
The ssh-rsa key fingerprint is be44e9f69bbaee579121fa9e272e021c.
Are you sure you want to continue connecting (yes/no)?
yes
ok: [server1]
TASK [install nginx] ***********************************************************
changed: [server1]
TASK [mkdir document root] *****************************************************
changed: [server1] => (item={u'name': u'sample1'})
changed: [server1] => (item={u'name': u'sample2'})
TASK [put vhost config] ********************************************************
changed: [server1]
TASK [put index.html] **********************************************************
changed: [server1] => (item={u'name': u'sample1'})
changed: [server1] => (item={u'name': u'sample2'})
TASK [start nginx] *************************************************************
changed: [server1]
PLAY RECAP *********************************************************************
server1 : ok=6 changed=5 unreachable=0 failed=0
$
実行は無事できました。
ちゃんとWebサーバに繋がるでしょうか?ブラウザで接続してみましょう。
サーバsample1
http://sample1/へ接続します。 無事に表示されましたね。
サーバsample2
http://sample2/へ接続します。 こちらも当然ですが、きちんと表示されました。
サーバsample3
最後に、/etc/hosts
に記載しましたが、Playbookでは記載していないホストです。 http://sample3/へ接続してみると。。。 nginxの初期ページが表示されました。これはこれで、想定通りです。
ホスト3台として設定
では、設定変更してみましょう。 vars
のhosts
に、sample3
を下記のように追記します。
- hosts: all
vars:
hosts:
- { name: sample1 }
- { name: sample2 }
- { name: sample3 }
実行 その2
では、再び Ansible を実行してみましょう。
$ ansible-playbook -k -i hosts playbook.yml
SSH password:
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [server1]
TASK [install nginx] ***********************************************************
changed: [server1]
TASK [mkdir document root] *****************************************************
ok: [server1] => (item={u'name': u'sample1'})
ok: [server1] => (item={u'name': u'sample2'})
changed: [server1] => (item={u'name': u'sample3'})
TASK [put vhost config] ********************************************************
changed: [server1]
TASK [put index.html] **********************************************************
ok: [server1] => (item={u'name': u'sample1'})
ok: [server1] => (item={u'name': u'sample2'})
changed: [server1] => (item={u'name': u'sample3'})
TASK [start nginx] *************************************************************
changed: [server1]
PLAY RECAP *********************************************************************
server1 : ok=6 changed=5 unreachable=0 failed=0
$
sample3
が増えたことで影響のある箇所はchanged
となっていますね。素晴らしい。
サーバsample3
再度、sample3
に接続してみましょう。 http://sample3/
はい、今度はきちんと表示されました。
まとめ
template便利ですね。 今後も使い所を研究していきたいと思います。