89
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-01-07

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

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

89
85
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
89
85

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?