Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
86
Help us understand the problem. What is going on with this article?
@volanja

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

More than 5 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

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

86
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
volanja

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
86
Help us understand the problem. What is going on with this article?