Edited at

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

More than 3 years have passed since last update.


v0.1へアップデートしました。(2015/01/12)

今後は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の使い方


インストール

$ 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)にあります。

以降はサンプルを使用して説明します。

.

├── 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には対応していません。。

[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

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