Ansibleの設定ファイルを使ってServerspecを実行するテンプレート作成用Gem(ansible_spec)を作りました。


# [v0.1へアップデートしました。(2015/01/12)](http://qiita.com/volanja/items/5192d614ae3e6759fff7)
今後はv0.1を使用してくださいm(_ _)m

# まえがき
あけましておめでとうございます。
正月休み中に、タイトルの通り、ansbile_specというGemを作りましたので紹介します。
Gemを覚えたてで何でもGemにしたい症候群に罹っています。

# テンプレート作成用Gem(ansible_spec)がすること。
* 専用のRakefileとspec/spec_helper.rbを生成します。それだけです。  
いくつかの決まり事(制限)を守ることで、Ansibleの設定ファイルをもとにSeverspecのテスト先とその内容(ロール)を決め、テストを実行します。

# Rakefileとspec/spec_helper.rbで最終的にできること。
* Serverspecの設定ファイルとしてAnsibleの設定ファイル(InventoryFile、playbook)を使用します。
* Serverspecは、AnsibleのInventoryFileから対象ホストを、playbookから対象ロールを読み込み、ロール配下のテストを実行します。Ansibleで複数のホストを設定していても、複数のホストにテストを実行します。
* (注)AnsibleのtaskからServerspecのテストを自動生成するわけではありません。  


# 作ったきっかけ(困っていたこと)
* Serverspec用の設定ファイルとAnsibleの設定ファイルが二重化しており設定が大変だった。
設定ファイルを1つにして、二重化を解消したい。

* AnsibleのRoleとServerspecのSpecファイルがバラバラで管理されていて、管理が大変だった。
同じディレクトリ下におきたい。(roles/nginx/spec/nginx_spec.rbみたいに。)

* Serverspecで複数ホスト・複数Roleのテストを実行する方法が(自分の中で)確立していなかった。
Serverspecで複数ホスト・複数Roleのテストを実行したい。



# Gemの使い方
## インストール

```bash
$ gem install ansible_spec
```

## 使用方法
ansible_specをインストールすると、次のコマンドを使用できます。
(serverspecに似た名前にしています。Gemの内部的にもかなり参考にさせて頂いています。)

```
$ ansiblespec-init 
    create  spec
    create  spec/spec_helper.rb
    create  Rakefile
```

## Ansibleのファイル/ディレクトリ構成を変更する。

基本的な注意点は次のとおりです。

* InventoryFile名はhostsで固定
* playbook名はsite.ymlで固定
* specファイルはroles/*/spec/*_spec.rbとなるようにする。

サンプルは[ここ(ansible-sample-tdd)](https://github.com/volanja/ansible-sample-tdd)にあります。
以降はサンプルを使用して説明します。

```
.
├── README.md
├── hosts                        #InventoryFileです。AnsibleとServerspecで使用します。(v0.0.1では固定)
├── site.yml                     #playbookです。AnsibleとServerspecで使用します。(v0.0.1では固定)
├── nginx.yml                    #site.ymlでincludeすることもできます。
├── roles
│   ├── mariadb
│   │   ├── spec                 #specファイルはここにおきます。
│   │   │   └── mariadb_spec.rb  
│   │   ├── tasks
│   │   │   └── main.yml
│   │   └── templates
│   │       └── mariadb.repo
│   └── nginx
│       ├── handlers
│       │   └── main.yml
│       ├── spec                 #specファイルはここにおきます。
│       │   └── nginx_spec.rb
│       ├── tasks
│       │   └── main.yml
│       ├── templates
│       │   └── nginx.repo
│       └── vars
│           └── main.yml
├── Rakefile                     #Gemで作成され、Serverspecが使用します。
└── spec                         #Gemで作成され、Serverspecが使用します。ここにテストファイルは置きません。
    └── spec_helper.rb
```

### Ansible設定ファイルの内容
SeverspecはAnsibleの設定ファイルを読み込みますが、Ansibleが動くように書けばOKです。

* InventoryFileの例  
DynamicInventoryには対応していません。。

```hosts
[server]
192.168.0.103
192.168.0.104
```

* Playbookの例  
一応includeもできます。

```site.yml
- name: Ansible-Sample-TDD
  hosts: server  #InventoryFileのグループ名
  user: root
  roles:
    - nginx
    - mariadb
```

###Ansibleの実行
いつもどおり、実行します。  

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

###テストの実行
本題のテストです。
テストを行う前にテストの実行コマンドを確認しておきます。

* テストの確認

```
$ rake -T
rake serverspec:Ansible-Sample-TDD  # Run serverspec for Ansible-Sample-TDD / Run serverspec for Ansible-Sample-TDD 
```

* テストの実行  
コマンドを確認できたので、テストを実行します。2つのサーバに対してnginxとmariadbのテストを実行しています。

```
$ rake serverspec:Ansible-Sample-TDD
Run serverspec for Ansible-Sample-TDD to 192.168.0.103
/Users/Adr/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -S rspec roles/mariadb/spec/mariadb_spec.rb roles/nginx/spec/nginx_spec.rb
...........

Finished in 0.40289 seconds
11 examples, 0 failures
Run serverspec for Ansible-Sample-TDD to 192.168.0.104
/Users/Adr/.rvm/rubies/ruby-1.9.2-p320/bin/ruby -S rspec roles/mariadb/spec/mariadb_spec.rb roles/nginx/spec/nginx_spec.rb
...........

Finished in 0.4004 seconds
11 examples, 0 failures
```

以上です。もし不具合等あればコメント頂けると嬉しいです。