Tech-Circle#6 Ansible ハンズオン ～Lesson２～

Lesson 2 では[Tech-Circle#6 Ansible ハンズオン ～Lesson１～](http://qiita.com/tksarah/items/ebeee95ab0cff0e779be)で作った Playbook を **Role** という汎用的に使える形に書き換えてみます。**Role** の形にしておくと規模が大きくなったり処理が長くなったりする時にも便利であり、メンテナンス性、視認性も上がります。要するによりわかりやすく、管理しやすくもなるので、最終的にはこの形で Playbook を作っておくと良いと思います。

Lesson 1 同様、[Tech-Circle#6 Ansible ハンズオン ～事前準備～](http://qiita.com/tksarah/items/3558304d9108c7c57464)で準備いただいた以下の環境でハンズオンをしていただきます。

![env.png](https://qiita-image-store.s3.amazonaws.com/0/75458/a49624f2-4fe6-ae73-cd1a-6c1f4a185358.png)

本ハンズオンでは **Target(blog)** に **WordPress** を構築することをゴールとします。ゴールそのものは Lesson１と同じです。

![goal.png](https://qiita-image-store.s3.amazonaws.com/0/75458/1900015a-c5ee-0699-0bde-1365f3c1e5bf.png)

具体的には、Target(blog) に 必要なパッケージを host の Ansible を使ってプロビジョニング・コンフィグレーションします。

# Lesson１を行った方へ

Lesson１を進めた後は、既に WordPress 環境が完成されているので、お手数ですが一度 blog VM を破棄してから「Role を作ってみよう」へ進んでください。

破棄する場合は、```vagrant destroy``` コマンドを実施します。Windows , OS X , Linux ともコマンドは同じです。

```shell-session:Linuxでの例
$ pwd
/home/hoge/techcircle6
$ vagrant destroy blog
    blog: Are you sure you want to destroy the 'blog' VM? [y/N] y
==> blog: Forcing shutdown of VM...
==> blog: Destroying VM and associated drives...
$
```

破棄は数秒で終わります。終わったら、再び ```vagrant up blog``` を実行して起動した後、事前準備の「["host"と"blog"間のSSH 接続の準備](http://qiita.com/tksarah/items/3558304d9108c7c57464#host%E3%81%A8blog%E9%96%93%E3%81%AEssh-%E6%8E%A5%E7%B6%9A%E3%81%AE%E6%BA%96%E5%82%99)」を実施（具体的には host 側から```ssh-copy-id blog```）し、以下に進んでください。

# Role を作ってみよう
まず、ハンズオンファイルをダウンロードします。Lesson１で取得済みの場合 ```git clone``` は不要です。

```shell-session
vagrant@host:~$ git clone https://github.com/tksarah/techcircle6.git
vagrant@host:~$ cd techcircle6/lesson2
```

ここを Lesson 2 のカレントとします。ここにまず下記のようにディレクトリを作っていきましょう。

```shell-session
$ mkdir -p roles/wordpress/{tasks,templates,vars}
```

今回の Role 作成のイメージ（下図）としては、lesson1.yml の中身を、上で作成した tasks , templates , vars 以下に割り振っていき、それをはじめにコールする lesson2.yml を準備するという感じです。

![2015-05-22 13-39-01.png](https://qiita-image-store.s3.amazonaws.com/0/75458/728079d6-548b-d8f9-4cf6-9b3e6401da0d.png)


注意点としては書くディレクトリではじめに読み込まれるファイル名は **main.yml** と決まってます。よって要所要所でそのファイルを作っていく事になります。

まず、変数部分を定義した以下の部分を vars ディレクトリ下の main.yml として置きます。

```lesson1.yml
  vars:
    dbname: wordpress
    dbuser: wordpress
    dbpassword: password
```

```roles/wordpress/vars/main.yml
---
  dbname: wordpress
  dbuser: wordpress
  dbpassword: password
  doc_root: /var/www/html
```

vars セクションであることは vars/ 以下にある事でわかっているので ```vars:``` というのを省いた形で書きます。

次に tasks 部分を適用していきます。vars でやったことと基本的には同じです。lesson1.yml の ```tasks:``` 以下に書いた部分を tasks/main.yml として置きます。

```roles/wordpress/tasks/main.yml
---
  - name: Install Packages
    yum: name={{ item }} state=latest
    with_items:
      - php
      - php-mysql
      - mariadb-server
      - MySQL-python
# （以下略）
```

次に templates ディレクトリです。このディレクトリ以下には template モジュールで使われるファイルを置きます。lesson1.yml でも template モジュールを使っていたことを思い出してください。そのファイルである、**wp-config.php.j2** をここに置きます。

```
$ cp wp-config.php.j2 roles/wordpress/templates/
```

ここで、ちょっと tasks/main.yml にもどってもらって、ここの template モジュールを使っているところを見てください。パスも意識して指定しているかと思います。role として Ansible を使うときは template モジュールで使われるファイルは templates 以下に置くことでどこにあるかがわかるためここではファイル名だけ指定すればよくなります。よって以下のように修正します。

```roles/wordpress/tasks/main.yml
    - name: Copy wp-config.php
      template: src=wp-config.php.j2 dest=/var/www/html/wordpress/wp-config.php mode=0666
```

ここまでで Role としての作成は終わりです。WordPress をつくり上げるアイテムがまるっと roles/wordpress 以下にできあがりました。

最後に、呼び出し用というか実行用のファイルを作ります。

```~/techcircle6/lesson2/lesson2.yml
---
- hosts: all

  user: vagrant
  sudo: yes

  roles:
    - wordpress
```

変わったところは最後の2行で、もはや見たままの意味ですがここの部分で「 WordPress の Role を使え」としています。

これで、準備は終わりです。

# 実行

Lesson 1 同様実行してみます。

```shell-session
vagrant@host:~/techcircle6/lesson2$ ansible-playbook -i ansible_hosts lesson2.yml
```

正常に実行され、結果 WordPress が利用可能になったかを確かめてください。

# 終わりに

今回作ったのは WordPress 用の Role です。このように Role という形で期待する状態にもっていく処理内容をまるっとまとめたものを作っていくことで Playbook ファイルを綺麗に整理もでき、運用性を高め、また汎用性を持たせることができます。多くの方が様々な用途の Role を作成しており、[Ansible Galaxy](https://galaxy.ansible.com/) というところで共有しています。こちら利用してみるのも面白いです。

# 参考

* [Ansible Doc - Best Practices - ](http://docs.ansible.com/playbooks_best_practices.html)