Ansible を使って EC2 に phpMyAdmin（Apache2.4 + PHP5.5）を立ち上げる

## バージョン＆記載ソースリポジトリ

| version | 
|:---|
| ansible 1.9.0.1 |

https://github.com/katsuhiko/ec2-playbooks/tree/master/roles/ec2-phpmyadmin

## Ansible してみる

Ansible の練習で、AWS EC2 Amazon Linux 環境に phpMyAdmin（Apache2.4 + PHP5.5）を立ち上げる Playbook を書いた。
AWS EC2 Amazon Linux しか考慮していないので、Debian系はもちろん、CentOS でも動かないと思う。

ディレクトリ構成は以下。role を使ってます！

```
├── ec2-phpmyadmin.example.yml
└── roles
    └── ec2-phpmyadmin
        ├── defaults
        │   └── main.yml
        ├── handlers
        │   └── main.yml
        ├── tasks
        │   └── main.yml
        └── templates
            ├── httpd.conf.j2
            ├── php-5.5.ini.j2
            ├── phpMyAdmin.conf.j2
            └── phpMyAdmin.config.inc.php.j2
```

利用する変数を defaults/main.yml と vars/main.yml のどちらで宣言するべきかを悩んだー。
ざっと調べたんだけど、なぜ２つに別けているかの意図が分かんなかった。。。

Ansible Galaxy( https://galaxy.ansible.com/ )から適当にソースを見た限りだと、defaults/main.yml を使うのがベターっぽかったので、defaults/main.yml に変数のデフォルト値を指定しました。
（「デフォルト値を指定」しているもんね。文章に書いてみるとそれが正解な気がしてきた！）

conf や ini の設定ファイルを少しでも変えたい場合は、変数化して、デフォルトから変えていることがわかるようにしています！
そのために templates を利用。
設定項目をすべて変数化するのは大変なので、必要な部分のみ。

Apache2.4, PHP5.5, phpMyAdmin を小分けの role にすべきかを悩んだんだけど、最初は１ファイルで行った方が悩みが少ないかなっと思って、１ファイルにしました！

```yaml:roles/ec2-phpmyadmin/taks/main.yml
---
- name: Upgrade all packages
  yum: name=* state=latest

- name: Install httpd
  yum: name={{ item }} state=latest
  with_items:
    - httpd24
    - mod24_ssl

- name: Put httpd.conf
  template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf backup=true mode=0644
  notify: restart httpd

- name: Disable welcome site
  command: mv -f /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.backup removes=/etc/httpd/conf.d/welcome.conf
  notify: restart httpd
  when: not httpd_welcome_site_enabled

- name: Set httpd service to start on boot
  service: name=httpd enabled=true

- name: Install php
  yum: name={{ item }} state=latest
  with_items:
    - php55

- name: Put php.ini
  template: src=php-5.5.ini.j2 dest=/etc/php-5.5.ini backup=true mode=0644
  notify: restart httpd

- name: Install phpmyadmin
  yum: name=phpmyadmin state=latest enablerepo=epel

- name: Put phpMyAmin.conf
  template: src=phpMyAdmin.conf.j2 dest=/etc/httpd/conf.d/phpMyAdmin.conf backup=true mode=0644
  notify: restart httpd

- name: Put config.inc.php
  template: src=phpMyAdmin.config.inc.php.j2 dest=/etc/phpMyAdmin/config.inc.php backup=true mode=0640
  notify: restart httpd
```

この role を呼び出す playbook の例は以下。
playbook をみると、Apache2.4, PHP5.5, phpMyAdmin の role は別けた方がよかった気がする。。。

```yaml:ec2-phpmyadmin.example.yml
- hosts: all
  sudo: yes
  vars:
    phpmyadmin_servers:
      - host: rds1.xxx.ap-northeast-1.rds.amazonaws.com
      - host: rds2.xxx.ap-northeast-1.rds.amazonaws.com
  roles:
    - ec2-phpmyadmin
```

実行方法は、inventory ファイルなしの場合、以下のような感じで実行できる。

```
$ ansible-playbook -i "xxx.xxx.xxx.xxx," --user=ec2-user --private-key=xxx.pem ec2-phpmyadmin.yml
```

## Ansible してみて

気軽に動くし、使いやすいかも。Chef と Ansible なら、、、どっちでも良いかな。
ぼくは当面は Ansible を使うと思うけど。仕事次第かな。

## 関係ないけど

HiBiSクラウド部会 & JAWS-UG　合同勉強会」( http://qiita.com/katsuhiko/items/882b5328b17e20fbcd22 ) のエモパーの人も言われてたけど、EC2 の micro インスタンスは優れものだね。

１つのサーバーにあれこれ機能を乗せるより、phpMyAdmin のみ、redmine のみっという感じで目的別にインスタンスを立てて、必要に応じて、スケールアップすれば良いもんね。

EC2 インスタンスもブラウザではなくコマンドで作りたくなってきたけど、ansible経由と、AWS CLI のどちらが楽なのかな。

１目的、１サーバー、１Playbook で作って行くぜー。

## 追記

2015/06/21 role を ec2-yum-update, ec2-httpd, ec2-php, ec2-phpmyadmin の４つに分割しました。すっきりしたような、見通しが悪くなったような。。。
やりたいことが増えてきたら、この role 別けがよい方向に行くと信じています。

でも、、、Ansible galaxy を利用したいっとは思わないんだよね。。。なんでだろう。。。