ansibleで仮想マシンにnginxを入れる

# はじめに
web開発を行う上でよく使われる

+ nginx
+ php
+ mysql
+ memcached

以上のものをvagrantで作った仮想マシンに入れていきます。
今回はnginxを入れてみます。


# 環境

+ ホストマシンはMac OS X 10.7.5
+ 仮想マシンはcentos6.5


# 準備
必要なものは以下になります。

+ vagrant (インストール方法は[コチラ](http://qiita.com/kanuma1984/items/7d7706bf79a8773037b2, "vagrant"))
+ ansible (インストール方法は[コチラ](http://qiita.com/kanuma1984/items/45dfac5ba48f152ce8d5, "ansible"))


# ansibleのplaybookを作成

以下の順番でplaybookを作っていきます。

+ ディレクトリ作成
+ インベントリファイル作成(仮想マシンのホスト情報)
+ playbook(local.yml)作成とタスク追加
+ nginx周りのタスク追加(インストール&設定など)
+ confファイル

##ディレクトリ作成

```bash
$ cd /tmp/vagrant-centos
$ mkdir provisioning
```

##インベントリファイル作成
ansibleが実行された時、どのホストに対して
タスクを行うのかを知る必要があります。

そのホストに関する情報を記述しておくファイルがインベントリファイルです。
将来的に、ステージング、本番と環境を分けることを考慮して作ります。

```bash
$ mkdir inventory
$ touch inventory/local
```

作られたファイルにホスト情報を追加していきます。
今回は以下のような設定にしました。

```text:local
# vi: set ft=yaml:
[local]
localhost ansible_ssh_port=2222 ansible_ssh_user=vagrant ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
```

各項目を簡単に説明すると…

+ [local]・・・playbook(local.yml)内で対象ホストを指定する際に使用
+ localhost・・・対象ホスト
+ ansible_ssh_port・・・localhostにsshで入る時のport
+ ansible_ssh_user・・・localhostにsshで入る時のユーザー
+ ansible_ssh_private_key_file・・・localhostにsshで入る時の秘密鍵

こんな感じです。

##playbook(local.yml)作成とタスク追加

local.ymlが、仮想マシンに対して実行するタスクを管理するファイルとなります。
local.ymlにnginxを入れるタスクを追加します。
※拡張子(.yml)にあるように、playbookはyml形式で記述していきます。


```text:local.yml
---
# file: provisioning/local.yml
 - name: Nginx Playbook # タスク名
  hosts: local          # 対象ホスト 
  sudo: yes             # sudoするか
  roles:                # 実際のタスクを記述しているディレクトリ
    - nginx
  tags:                 # タスクをタグ付け
    - nginx
```
これで以上です。

rolesについて軽く説明しておきます。
rolesは、実際のnginxのインストールや各種タスクを記述しておくところです。
playbookを実行し、"Nginx Playbook"というタスクが実行されると、
ansibleはprovisioning/roles/以下のnginxを見に行き、
各種タスクを実行していきます。


# nginx周りのタスク追加(インストール&設定など)
nginxインストールや各種タスクを追加していきます。
まずは、ディレクトリとymlファイルを作ります。

```bash
$ mkdir provisioning/roles
$ mkdir provisioning/roles/nginx
$ mkdir provisioning/roles/nginx/tasks
$ touch provisioning/roles/nginx/tasks/main.yml
$ mkdir provisioning/roles/nginx/templates
```
roles下にnginxというディレクトリを作った理由としては、
今後、phpやmysqlなどを追加する際にキレイに分けられるようにするためです。

templatesというディレクトリの使い道としては、
ここにプロジェクト用にカスタマイズしたconfファイルを置いておき、
それを対象ホストに生成するために使います。

次に…
main.ymlにに各種タスクを追加していきます。

```text:main.yml
---
# file: provisioning/roles/nginx/tasks/main.yml
- name: install nginx
  yum: name=nginx state=present

- name: put nginx.conf
  template: src=roles/nginx/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf

- name: put conf.d/default.conf
  template: src=roles/nginx/templates/default.conf.j2 dest=/etc/nginx/conf.d/default.conf

- name: put conf.d/virtual.conf
  template: src=roles/nginx/templates/virtual.conf.j2 dest=/etc/nginx/conf.d/virtual.conf

- name: set auto start nginx
  command: chkconfig nginx on
- name: restart nginx
  command: service nginx restart
```
とりあえずこれくらいで。


##confファイル
provisioning/roles/nginx/templates
直下に以下のファイルをおきます。

+ nginx.conf.j2
+ default.conf.j2
+ virtual.conf.j2

.j2というファイルになっているのは、ansibleが
テンプレートエンジンとしてJinja2を使っているからです。

そのまま(.conf)でも問題ないですが、
変数を用いて動的に値を埋め込む時などに必要かな？と思っています。
(まだやってない…orz)

これで準備は完了です。

# playbook実行
playbookの実行については、vagrantで行う方法とansibleで行う方法があります。

vagrantから実行する方法をとりますので、
Vagrantfileに設定追加してあげます。

```text:Vagrantfile
  # nginx用の設定をssh設定の下あたりに追加
  config.vm.network :forwarded_port, guest: 80, host: 8080

  # ↓を一番下に追加します
  config.vm.provision :ansible do |ansible|
    ansible.playbook = "provisioning/local.yml"
    ansible.inventory_path = "provisioning/inventory/local"
  end
```
※それ以外の設定については[コチラ](http://qiita.com/kanuma1984/items/7d7706bf79a8773037b2, "vagrant-centos")を参照して頂ければと思います。


長かった…
ではでは、仮想マシンを立ち上げて実行します。

```bash
$ vagrant up
$ vagrant provision
PLAY [Nginx Playbook] ******************************

GATHERING FACTS ************************************
・・・・
```
ネットワークによっては結構時間がかかります。
反応がなくてイラっとくることもあります。

完了したら"vagrant ssh"でマシンに入って諸々確認してみてください。
ブラウザから"localhost:8080"でアクセスするとnginxのページが表示されます。
以上です！！


##余談
一度も"vagrant up"をしていないマシンに対して、
"vagrant up"を行うと、マシン作成後にprovisioningが行われます。
二度目以降は"vagrant provision"でprovisionを行ってください。