Ansible入門 ③ Ansibleのplaybookを書いてwebサーバにnginxを入れるところまで

今回はAnsible Playbookを書いてwebサーバにnginxを導入するところまでやっていきます。

ちなみに前回の記事は以下をご覧ください。
- [Ansible入門 ① vagrantでhost, web, dbの環境を作ってsshで接続するまで](http://qiita.com/sgp/items/93689f1814a192b5077e)
- [Ansible入門 ② webとdbの環境に対して、Ansibleコマンドを実行してみる](http://qiita.com/sgp/items/84c50bf29bb2a358b02c)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/33235c76-17ad-bf3c-303d-b3505d21cf82.png)

# Playbookを書いてwebとdbにuserを追加する

まずは簡単なplaybookの文法を紹介します。
↓のようなplaybookを作成しました。

```:playbool.yml
---                         # "---"をつけることでplaybookのファイルであることを意味します。
- hosts: all                # 実行するhostを宣言します。今回はwebとdbどちらにも以下のtasksを実行します。 
  sudo: yes                 # sudo コマンドで実行しますか？ yes or no
  tasks:                    # 実行するtasksを宣言します。
    - name: add a new user      # taskの名前です。任意ですが、分かりやすいようにしておくといいでしょう。
      user: name=awaji          # userというモジュールを使ってuserを追加していきます。
```

playbookは`.yml`形式で保存する必要があります。
今回はwebとdbに"awaji"というuserを追加するtaskを書いています。

userというモジュールを使用していますが、実行したい内容に応じて[Ansible公式ページ](http://docs.ansible.com/ansible/modules_by_category.html)
から選んで使用しましょう。

それでは実行して確認してみましょう。

```
[vagrant@host ~]$ ansible-playbook playbool.yml 
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' 
(default).
This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.

PLAY [all] ***********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.43.52]
ok: [192.168.43.53]

TASK [add a new user] ************************************************************************************************
changed: [192.168.43.52]
changed: [192.168.43.53]

PLAY RECAP ***********************************************************************************************************
192.168.43.52              : ok=2    changed=1    unreachable=0    failed=0   
192.168.43.53              : ok=2    changed=1    unreachable=0    failed=0
```

上手くできていますね。
192.168.43.52と192.168.43.53のそれぞれに対して`changed=1`となっていればOKです。

ちなみになんですが
もう一度実行してみるとどうなるでしょうか？

```
[vagrant@host ~]$ ansible-playbook playbool.yml 
[DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' 
(default).
This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg.

PLAY [all] ***********************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************
ok: [192.168.43.52]
ok: [192.168.43.53]

TASK [add a new user] ************************************************************************************************
ok: [192.168.43.52]
ok: [192.168.43.53]

PLAY RECAP ***********************************************************************************************************
192.168.43.52              : ok=2    changed=0    unreachable=0    failed=0   
192.168.43.53              : ok=2    changed=0    unreachable=0    failed=0
```

192.168.43.52と192.168.43.53のそれぞれに対して`changed=0`となっていますね。
このタスクは毎回実行するたびに awaji ユーザがどんどん追加されていくのではなくて、もし awaji ユーザがあった場合には何もしないというものになります。
これは「冪等性（べきとうせい）」というのですが、Playbookは「サーバのあるべき状態を記述したもの」であって、常にその状態にすることができるのだと認識しておいてください。

さて、ここまででplaybookは使えるようになりました。
実際にplaybookにいろいろと書いてnginxを入れていきましょう。

# nginxを導入する

結論から先に
nginxをインストールして起動状態にするplaybookです。

```:playbook.yml
---
- hosts: db
  sudo: True

  vars_prompt:
    - name: yum_update
      prompt: "Do you accept updates ?"
      private: no
      default: Y

  tasks:
    - name: Yum update packages
      yum: name=* state=latest
      when: yum_update == "Y"

    - name: install epel repository
      yum: name=http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm state=present

    - name: install nginx
      yum: name=nginx state=present

    - name: nginx start
      service: name=nginx state=started enabled=yes
```

[Ansible doc (yum)](http://docs.ansible.com/ansible/yum_module.html)にそのまま書いてあったりするので一度見てみるといいでしょう。

さて、解説していきます。

```:playbook.yml(一部)
  vars_prompt:
    - name: yum_update
      prompt: "Do you accept updates ?"
      private: no
      default: Y
```
`vars_prompt`はコマンド入力を受け付けることができます。
今回nginxを入れるのに必須ではないですが、参考までに付けてみました。
yum updateする必要はありますか？に対して [ Y / N ] を聞いているだけですね。
コマンドから入力した値は yum_update という変数に格納されます。
この変数を使って分岐などができますね。

```:playbook.yml(一部)
    - name: install epel repository
      yum: name=http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm state=present

    - name: install nginx
      yum: name=nginx state=present

    - name: nginx start
      service: name=nginx state=started enabled=yes
```
nginxをインストールするにはepelリポジトリが必要なので入れてやります。
その後は普通にyumモジュールでnginxをインストールすればOKです。

簡単ですね。

最後に確認だけしておきましょう。
ブラウザを開いてwebのIPにアクセスしてみましょう。
今回はwebサーバは192.168.43.52でしたね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/d555c6ba-1ff2-01cd-e614-9976bbdee61c.png)


この画面まで表示できれはOKです。
いい感じですね。

あとはrailsにunicornを入れて…
dbにmysqlを入れて…
などなどやっていけば一通りの環境構築はできますね。

次はアプリケーション（Ruby on Rails）をgitからクローンしてくるところまで書いてみようと思います。