Ansibleを使って複数ホストに同時にインストールしてみる

[構成管理ツール Ansible](http://www.ansible.com/) を使って複数ホストに何かをインストールしてみた。

## 動機、注意など
* 環境が変わる度、 過去のメモを見ながら yum や apt を叩いたりするのに飽き飽きしている → うまい管理方法はないか
  * ゆるく Infrastructure as Code をやってみよう
* まだよくわかっておらず、Ansible をシェルスクリプトっぽく便利に使ってみた感じなので、色々間違っていると思う。

## やったこと
* Docker を 複数ホストにインストールする
  * 別に Docker でなくても良かったが、今後使ってみようと思ったので

### 前提など
* ローカル環境：
  - MacOSX (Mavericks) + Homebrew
* 管理対象：
  1. 職場にある RHEL 6.6 (既に色々入っている)
  2. ローカルの仮想サーバー CentOS 6.6 (Vagrant で構築したばかり; 方法は後述)
* EPEL版 Docker を インストールする
  - (RHEL 7 には docker が同梱されているため、そもそもこの方法ではうまくいかない)

## Docker をインストールする Ansible playbook

* Docker の[CentOSへのインストールマニュアル](https://docs.docker.com/installation/centos/)を見ながら、同じような動きをする Playbook を作った 
  - 単に上から順に書いただけなので、 Ansible の使い方や流儀には合っていなさそう
* EPEL については、 Ansible Galaxy から見つけてきた、 [EPEL を登録する Ansible Role](https://galaxy.ansible.com/list#/roles/35) を使う
  - CentOS 側は全く何も触っていないので、 EPEL を入れる必要があった
  - RHEL 側は EPEL が入っているので、 EPEL を入れるところは 何も起こらないはず（無害） (idempotency!)

```yaml:docker-yum.yaml
- hosts: all
  sudo: yes
  tasks:
    - name: Install libselinux-python
      yum: name=libselinux-python state=present

- hosts: all
  sudo: yes
  roles:
    - goozbach.EPEL

- hosts: all
  sudo: yes
  tasks:
    - name: Install docker-io from yum
      yum: enablerepo=epel name=docker-io state=present
    - name: Start docker service
      service: name=docker state=started
```


## 手順
Ansible のインストール

```shell-session:
keigoi@zorba$ brew update
keigoi@zorba$ brew install ansible
```

EPEL repo を有効にしてくれる Role を Ansible Galaxy からゲット

```shell-session:
keigoi@zorba$ ansible-galaxy install goozbach.EPEL
```

インストール対象のホストを記述したファイルを準備. 
ssh コマンドに渡すホスト名が使える模様.

```text:hosts
[vagrant-centos]
vagrant-centos

[kirin]
123.45.67.89
```

実行 (以下はインストール完了後の実行ログ. 実際には Playbook に書き足しながら何度も実行したので、所々で changed と出る)

```shell-session
keigoi@zorba$ ansible-playbook -i hosts --ask-sudo-pass docker-centos.yml
sudo password:

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [vagrant-centos]
ok: [kirin]

TASK: [Install libselinux-python] *********************************************
ok: [vagrant-centos]
ok: [kirin]

PLAY [all] ********************************************************************

GATHERING FACTS ***************************************************************
ok: [vagrant-centos]
ok: [kirin]

TASK: [goozbach.EPEL | ensure directory /etc/pki/rpm-gpg/] ********************
ok: [vagrant-centos]
ok: [kirin]

TASK: [goozbach.EPEL | copy GPG key] ******************************************
ok: [vagrant-centos]
ok: [kirin]

...

TASK: [Start docker service] **************************************************
ok: [vagrant-centos]
ok: [kirin]

PLAY RECAP ********************************************************************
kirin                      : ok=16   changed=0    unreachable=0    failed=0
vagrant-centos             : ok=16   changed=0    unreachable=0    failed=0
```

## 付録：Vagrant を使った CentOS 環境構築
* Vagrant Cloud に 色々と OSイメージ(?) が置いてあるようなのでそれを使う
* 今回使ったのは https://vagrantcloud.com/chef/boxes/centos-6.6
  * どこの誰が作ったのか分からない… 6.5 の記述を見るに、 https://github.com/opscode/bento が 元か。

```shell-session
keigoi@zorba$ mkdir vagrant-centos && cd vagrant-centos
keigoi@zorba$ vagrant init chef/centos-6.6
keigoi@zorba$ vagrant up
keigoi@zorba$ vagrant ssh-config --host vagrant-centos >>~/.ssh/config # ssh vagrant-centos でログインできるように
```

### 余談
* Vagrant を VirtualBox で動かすと遅いという話をどこかで見たので、 わざわざ Vagrant VMWare Integration を買ってしまった ($79)