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

  • 80
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

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