かつお君へ Vagrant × Ansible でローカル開発環境を作成


<h2>VagrantコマンドでVirtualBoxの仮想環境を立てよう</h2>

この記事ではCentOS6.5、PHP5.6、Mysql5.6、HTTPD2.2の環境にMYSQLのテストDBとテストユーザー作成をansibleで一発で作成します。

Vagrant ダウンロード
http://www.vagrantup.com/downloads.html

VirtualBox ダウンロード
https://www.virtualbox.org/wiki/Downloads


Vagrantを立ち上げます。
まずはネットに上がっているbox(仮想環境)をvagrantに追加しましょう。
例ではCentOS6.5のboxをネットから引っ張ってきました。

```bash:
vagrant box add CentOS6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box
```
作業ディレクトリに仮想環境置き場を作成します。
また、ローカルとシンクするファイルを置くフォルダを作成します。

```bash:
cd ~/Documents/
mkdir local.example.com
cd local.example.com
mkdir www
```
仮想環境の設定ファイルを自動生成します。

```bash:
vagrant init CentOS6.5
```
自動生成されたファイルを編集します。

```bash:
vim Vagrantfile
```
ローカルのIPを設定します。
複数の仮想環境を立ち上げる時のことを考えて、IPは他と被らないものを設定すると良いです。

```bash:~/Documents/local.example.com/Vagrantfile
# config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "private_network", ip: "192.168.33.10"
```

先ほど作成した、仮想環境とシンクさせるディレクトリの設定をします。
WEB上で表示するものを作成するので、例ではApacheのルートディレクトリっぽく設定してみます。

```bash:~/Documents/local.example.com/Vagrantfile
# config.vm.synced_folder "../data", "/vagrant_data"
config.vm.synced_folder "./www", "/var/www"
```
メモリのサイズを設定します。

```bash:~/Documents/local.example.com/Vagrantfile
config.vm.provider "virtualbox" do |vb|
#   # Display the VirtualBox GUI when booting the machine
#   vb.gui = true
#
#   # Customize the amount of memory on the VM:
  vb.memory = "1024"
end
```

後ほどAnsibleを使うのに（この例の場合は）必要な設定です。
Vagrant1.7以降から使用するkeyを自動生成するようになりましたが、ローカルなので従来のままでいいと思います。

```bash:~/Documents/local.example.com/Vagrantfile
config.ssh.insert_key = false
```

他にもホスト名なども追加しておくといいかもしれません。
起動時に`/etc/hosts`に書き込んでくれるのでURLでアクセスできるようになります。

```bash:~/Documents/local.example.com/Vagrantfile
config.vm.hostname = "local.example.com"
```

Vagrantを立ち上げます。

```bash:
vagrant up
```

これで仮想環境が出来ました。
先ほど作ったVagrantにsshで入れます。

```bash:
vagrant ssh
```
Macに戻ってくるときはexitです。

```bash:
exit
```

<h2>Ansibleをインストールして仮想環境にコマンドを打ってみよう</h2>

環境構築はコマンドをいちいち打っていると日が暮れるので、Ansibleを採用します。

```bash:
brew install ansible
```
VagrantサーバーにMacからAnsibleが実行出来るように設定します。
ファイルが無ければ新規作成、あれば追記して下さい。

```bash:
vim ~/.ssh/config
```

```bash:~/.ssh/config
Host 192.168.33.*
  User vagrant
  IdentityFile ~/.vagrant.d/insecure_private_key
```
ホスト管理ファイルを作成します。

```bash:
mkdir /usr/local/etc/ansible
vim /usr/local/etc/ansible/hosts
```

```bash:/usr/local/etc/ansible/hosts
[local.example.com]
192.168.33.10
```
pingを実行して返って来れば成功です！

```bash:
ansible local.example.com -m ping
```

```bash:
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```

<h2>AnsibleのPlaybookで仮想環境を構築しよう</h2>

仮想環境にインストールするものをPlaybookに記述していきます。
例ではphp5.6、mysql5.6、httpd2.2をインストールし、mysqlのユーザを作成します。
mysqlのDB名はtest、ユーザはtest、パスワードはpassで作成しています。
本当は細かいお作法がありますが今回は無視して1枚に書きます。

```bash:
vim site.yml
```

```bash:~/Documents/local.example.com/site.yml
---
- hosts: local.example.com
  sudo: yes
  vars:
    mysql_url: http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6
    mysql_ver: "5.6.26-1"
    mysql_items:
      - rpm: MySQL-client-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-devel-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-server-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-shared-{{ mysql_ver }}.el6.x86_64.rpm
      - rpm: MySQL-shared-compat-{{ mysql_ver }}.el6.x86_64.rpm
  tasks:
    - name: install httpd
      yum: name=httpd state=installed
    - name: install remi
      yum: name=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
    - name: install php
      yum: pkg={{ item }} state=installed enablerepo=remi,remi-php56
      with_items:
        - php
        - php-cli
        - php-common
        - php-devel
        - php-fpm
        - php-json
        - php-mbstring
        - php-mcrypt
        - php-mysql
        - php-pdo
        - php-process
        - php-xml
    - name: install mysql
      yum: name={{ mysql_url }}/{{ item.rpm }} state=present
      with_items: mysql_items
    - name: install python-mysql
      yum: name=mysql-connector-python state=installed
    - name: stop iptables
      service: name=iptables state=stopped enabled=false
    - name: start php-fpm
      service: name=php-fpm state=started enabled=yes
    - name: start httpd
      service: name=httpd state=started enabled=yes
    - name: start mysql
      service: name=mysql state=started enabled=yes
    - name: get mysql password
      shell: cat /root/.mysql_secret | awk '{print $18}'
      register: mysql_root_password
    - name: setup mysql root
      command: mysqladmin -u root password {{ mysql_root_password.stdout }}
    - name: copy .my.cnf
      template: src=.my.cnf.j2 dest=/root/.my.cnf owner=root mode=0600
    - name: setup mysql database
      mysql_db: name=test state=present
    - name: setup mysql user
      mysql_user: name=test password=pass priv=*.*:ALL,GRANT state=present
```
続いてmysqlの設定に必要なテンプレートファイルを作成します。

```bash:
vim .my.cnf.j2
```
```yml:~/Documents/local.example.com/.my.cnf.j2
[client]
user = root
password = {{ mysql_root_password.stdout }}
```

Playbookを実行するには以下のコマンドを入力します。

```bash:
ansible-playbook -l local.example.com site.yml
```
以下が返って来れば成功です。

```bash:
PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=12   changed=0    unreachable=0    failed=0  
```

<h2>apacheのアクセス先をローカルで作成しよう</h2>

先ほど、Vagrantfileに書いた`config.vm.synced_folder`の中身を用意します。
最初に`local.example.com`直下に作成した`www`内に、`index.html`を用意します。

```bash:
touch www/index.html
echo hello world! > www/index.html
```

下記にアクセスし、hello world!が表示されれば成功です。
http://local.example.com/

以上となります。
以降はwww以下にgit cloneしてきたり、ansibleで作成したDBにdumpしたsqlを流し込めばローカルのみで開発環境が整います。