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もできます。
- 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
以上です。もし不具合等あればコメント頂けると嬉しいです。