Redisをいじくり倒す環境をVagrant+Ansibleで構築する


`Redis`をいじくり倒してパフォーマンス検証することになったので環境構築してみる。

##必要なもの
 - Vagrant
 - VirtualBox
 - Ansible

##準備
###Vagrantをいれる
[ここ](https://www.vagrantup.com/)からダウンロードしていれる。

###VirtualBoxをいれる
[ここ](https://www.virtualbox.org/wiki/Downloads)からダウンロードしていれる。

###Ansibleをいれる

```
brew install ansible
```

##VagrantのBOXを追加する

今回はCentOS 7をいれる。

```
vagrant box add cent7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
```

適当なディレクトリを作成し、移動する。

```
mkdir hoge
cd hoge
```

Vagrant初期化。

```
vagrant init cent7
```

`Vagrantfile`ができるので以下のコメントアウトを外す。

```Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```

Virtual Machineを起動する。

```
vagrant up
```

`vagrant ssh`でもログインできるが、`Vagrantfile`で指定したipでログインできるかどうか試してみる。パスワードは`vagrant`。

```
ssh vagrant@192.168.10.33
```

##Ansibleの設定をする
inventory fileを作成する。ファイル名は適当に。

```hosts
[test-server]
192.168.33.10

[all:vars]
ansible_ssh_port=22
ansible_ssh_user=vagrant 
ansible_ssh_pass=vagrant
ansible_sudo_pass=vagrant
ansible_connection=paramiko
```

`ansible_connection=paramiko`を指定しないとうまいことsshでログインできないので注意。

Playbookを作る。ファイル名は適当に。

```playbook.yml
---
- hosts: test-server
  sudo: yes
  tasks:
    - name: libselinux-python install
      yum: name=libselinux-python state=latest
    - name: gcc install
      yum: name=gcc state=latest
    - name: redis source download
      get_url: >
        url=http://download.redis.io/releases/redis-2.8.19.tar.gz
        dest=/tmp/redis-2.8.19.tar.gz
    - name: redis unarchive
      command: >
        tar zxvf redis-2.8.19.tar.gz
        chdir=/tmp/
    - name: make
      command: >
        make
        chdir=/tmp/redis-2.8.19
    - name: make install
      command: >
        make install
        chdir=/tmp/redis-2.8.19
    - name: deamonize on
      replace: >
        dest=/tmp/redis-2.8.19/redis.conf
        regexp='daemonize no'
        replace='daemonize yes'
    - name: redis.conf copy
      shell: creates=/etc/redis.conf cp /tmp/redis-2.8.19/redis.conf /etc/redis.conf
    - name: redis start
      command: >
        redis-server /etc/redis.conf
      sudo: no
```

##実行してみる

```
ansible-playbook -i hosts playbook.yml
```



```実行結果
PLAY [test-server] ************************************************************ 

GATHERING FACTS *************************************************************** 
ok: [192.168.33.10]

TASK: [libselinux-python install] ********************************************* 
ok: [192.168.33.10]

TASK: [gcc install] *********************************************************** 
ok: [192.168.33.10]

TASK: [redis source download] ************************************************* 
ok: [192.168.33.10]

TASK: [redis unarchive] ******************************************************* 
changed: [192.168.33.10]

TASK: [make] ****************************************************************** 
changed: [192.168.33.10]

TASK: [make install] ********************************************************** 
changed: [192.168.33.10]

TASK: [deamonize on] ********************************************************** 
changed: [192.168.33.10]

TASK: [redis.conf copy] ******************************************************* 
ok: [192.168.33.10]

TASK: [redis start] *********************************************************** 
changed: [192.168.33.10]

PLAY RECAP ******************************************************************** 
192.168.33.10              : ok=10   changed=5    unreachable=0    failed=0   
```

上のは２回に実行した結果なので初回の結果とは若干違うかも。最終的に`ok=10`になってればOKだと思う。


##確認してみる
`vagrant ssh`でも直接sshでもどちらでもいいのでログインする。

```
vagrant ssh
```

```
[vagrant@localhost ~]$ redis-server -v
Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=41ebe2a844e67838
[vagrant@localhost ~]$ redis-cli
127.0.0.1:6379> 
```

ちゃんと入ってる。成功。

##参考
 - [構成管理ツール Ansibleを使ってみる](http://dev.classmethod.jp/tool/ansible/)
 - [AnsibleでRedisの2.5以降のバージョンをインストールするPlaybook](http://qiita.com/joytomo/items/d0cb45074c61dd8935fd)
 - [MacでAnsibleが動かなくなった時のファーストアクション](http://qiita.com/tienlen/items/f629f780eba18d5bfdf5)