Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Ansible編)

[Vagrant+Ansible+VirtualBoxでlocal・本番構築自動化(Vagrant+Virtualbox編)](http://qiita.com/kohei789/items/b87c3d47de8b215eff01)
の続きです。

***
# Ansibleとは

ChefやPuppetのような構成管理ツールである。
Ansibleはモジュールが用意されており、モジュールを使用することで
ミドルウェアのインストールや設定などが可能になる。
またこのモジュールを使用することで**冪等性**を担保できる。

このモジュールの集合をPlaybookといいChefのレシピのような役割である。

私見だが、設定ファイルがシンプルで使いやすく、対象インスタンスに対して何かを用意する必要がないため非常に使いやすく感じている。

本稿ではざっと流れを追ってみる。

***
# ansible導入

簡単な例として先ほど用意したローカル上の仮想mysqlサーバに対して
mysqlをインストールを行う。
### ansibleインストール
macの場合下記コマンドで完了。
`brew install ansible`

# Playbook作成
## rolesを作成。
Playbook配下には複数のrolesを用意する。
このroleを組み合わせ構成管理を行う。

playbook用のディレクトリを下記のように作成する。
common配下もmysql同様に作成。
/Playbook/roles/mysql以下には他にvars,files, handlers, defaultsなどを用意するが今回は省略。
```
Playbook
　　|_ roles
　　　　|_ common
　　　　|_ mysql
　　　　　　　|_ tasks
　　　　　　　|_ templates
　　　　　　　|_  ...
```
これらのディレクトリ構成は[Best Practices](http://docs.ansible.com/playbooks_best_practices.html#directory-layout)を参考にしたものであり、詳細は機会があれば記載します。

### ymlファイル等を用意

**template**ディレクトリにはdbで使用するmy.cnfを配置します。
これらは実際に使用するmy.cnfとなります。
**tasks**ディレクトリには下記mysql5.6.ymlを作成します。

```mysql5.6.yml
- name: yumで管理しているmysql削除
  action: command sudo yum remove -y mysql*
- name: mysqlに関するrpmファイルをダウンロード
  get_url: dest=/home/vagrant/ url={{item}}
  with_items:
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm

- name: ダウンロードしたmysql-rpmファイルをyumでインストール
  yum: name={{item}} state=present
  with_items:
      - MySQL-client-5.6.20-1.el6.x86_64.rpm
      - MySQL-devel-5.6.20-1.el6.x86_64.rpm
      - MySQL-server-5.6.20-1.el6.x86_64.rpm
      - MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
- name: ダウンロードしたmysql-shared.rpmファイルをyumでインストール
  yum: name=MySQL-shared-5.6.20-1.el6.x86_64.rpm state=present
```

以下では分解して説明します。

##### - command
nameの中身は任意です。実行時画面に出力されます。
action: command はyml内で通常のコマンドを使用したい場合に使用します。
ただしこの方法では冪等性は担保できません。

```
- name: yumで管理しているmysql削除
  action: command sudo yum remove -y mysql*
```

##### - get_url
ファイルを指定しダウンロードします。
既にダウンロード済みの場合は実行されません。
`dest`でダウンロード先を指定。
`{{item}}` は`with_items`で指定したurlを格納する変数となります。


```
- name: mysqlに関するrpmファイルをダウンロード
  get_url: dest=/home/vagrant/ url={{item}}
  with_items:
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-client-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-server-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-devel-5.6.20-1.el6.x86_64.rpm
       - http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.20-1.el6.x86_64.rpm
```

###### - yum
yumでインストールしたい場合使用。
インストール済みの場合は(略
`yum: name`でパッケージを指定。

```
- name: ダウンロードしたmysql-rpmファイルをyumでインストール
  yum: name={{item}} state=present
  with_items:
      - MySQL-client-5.6.20-1.el6.x86_64.rpm
      - MySQL-devel-5.6.20-1.el6.x86_64.rpm
      - MySQL-server-5.6.20-1.el6.x86_64.rpm
      - MySQL-shared-compat-5.6.20-1.el6.x86_64.rpm
- name: ダウンロードしたmysql-shared.rpmファイルをyumでインストール
  yum: name=MySQL-shared-5.6.20-1.el6.x86_64.rpm state=present
```

## role呼び出し用ymlを作成。

``` mysql.yml
- hosts: '{{hosts}}'
  user: '{{user}}'
  sudo: yes
  tasks:
     - include: ./roles/common/tasks/setup.yml
     - include: ./roles/mysql/tasks/mysql5.6.yml

     - name: master用cnfを配置
       template: src=./mysql/templates/my_master.cnf dest=/etc/my.cnf owner="root" group="root"

     - service: name=mysql enabled="yes" state=running
```

上記呼び出し用ymlを作成。

###### - hosts, user
下記hosts,userは引数を受ける。
hostsには対象インスタンスのホストを、userにはインスタンスログインユーザを
インスタンス内でsudo処理を行う場合はyesを、そうでない場合はnoを

```
- hosts: '{{hosts}}'
  user: '{{user}}'
  sudo: yes
```

###### - tasks
タスク以下に実行する内容を記述する。

###### - include

先ほど用意したymlを読み込み実行する。
setup.ymlの内容は割愛しているが、vimやwgetをインストールしている。

```
     - include: ./roles/common/tasks/setup.yml
     - include: ./roles/mysql/tasks/mysql5.6.yml
```

###### - template
ローカルからリモートにtemplateとして使用したいものを渡す。
`src`はローカル。`dest`はリモート, `owner`, `group`を指定することができる。(chown相当)

```
     - name: master用cnfを配置
       template: src=./mysql/templates/my.cnf dest=/etc/my.cnf owner="root" group="root"
```

###### -service

起動コマンド。serviceコマンド上で登録されている必要がある。
`name`対象を指定　
`enabled`は自動起動するかどうか
`state`で状態を指定。

```
     - service: name=mysql enabled="yes" state=running
```
これで準備は完了。

## イベントリファイルを用意。

カレントディレクトリに下記hostsファイルを作成する。（/etc/hostsではないので注意）

```hosts
dbm01 ansible_ssh_host=192.168.30.10  ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
```

ansible_ssh_private_key_fileは今回Vagrantを使用しているため指定している。
dbm01もVagrantfileで設定してあるホスト名である。

# 実行前のチェック

## --sytax-check
下記コマンドでsyntaxをチェックできる。
エラーが出なければ完了。

```
ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"} '../Playbook/mysql.yml  --syntax-check
```

## --check

下記コマンドで仮チェックを行える。(実際には実行しない)
エラーがなければ完了

```
ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"}' ../Playbook/mysql.yml  --check
```

### --extra-vars
実行時に任意の値を渡す。
先ほど作成したmysql.ymlで`{{hosts}}` ,`{{user}}`を変数で作成していたが
こちらの引数として渡す。json形式である。

# 実行

実際に実行してみる。
下記コマンドを実行。

```
ansible-playbook -i hosts --extra-vars='{"hosts":"dbm01","user":"vagrant"}' ../Playbook/mysql.yml
```

下記のようになれば成功

![スクリーンショット 2015-05-11 9.52.52 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63356/27c8e043-977f-1dc6-1024-f8d851253140.png)

`changed=1`は実際に変更が行われた数です。
今回は既にインストール済みのためこの数値となっています。