Rails
nginx
YAML
Ansible
playbook

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

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

ちなみに前回の記事は以下をご覧ください。
- Ansible入門 ① vagrantでhost, web, dbの環境を作ってsshで接続するまで
- Ansible入門 ② webとdbの環境に対して、Ansibleコマンドを実行してみる

image.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公式ページ
から選んで使用しましょう。

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

[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)にそのまま書いてあったりするので一度見てみるといいでしょう。

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

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

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

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

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