Serverspecでサーバ情報をファイルに保存してテストする方法

こんにちは!beardです!

Serverspecでファイルにテスト対象のサーバ情報を記述しておきたい場合、ちょっとした工夫が必要でした。

今回は、テストするときにファイルを指定してServerspecを実行する方法をご紹介します。

Serverspecのインストールと基本的な操作については、過去の記事『 Amazon OSS編~Serverspecパート①~ 』をご覧ください。

1. 今回テストする環境

例としてServerspecから2つのサーバのグループをテストします。

グループAに2台のサーバ、グループBに1台のサーバとしています。

今回はファイルを分けてサーバ情報を記述することを目的としているので、テスト内容は時刻が日本時間になっていること確認するだけです。

テスト対象のサーバをグループごとにymlファイルにまとめます。

テスト項目のディレクトリ構成は『 Serverspecで複数のサーバを一括テストする方法 』の記事と同じです。

ディレクトリ構成

1Serverspec2├Rakefile3├groupA.yml ←グループAの情報を記述4├groupB.yml ←グループBの情報を記述5├spec6└ common7   └time_spec.rb ←時刻設定のテスト。今回使います。

/usr/local/serverspec/groupA.ymlの内容

154.64.126.211:2  :roles:3    - common454.64.15.205:5  :roles:6    - common

/usr/local/serverspec/groupB.ymlの内容

154.64.93.240:2  :roles:3    - common
  1. これだけではファイルを読み込んでくれませんので、Rakefileとspec/spec_helper.rbを以下のように変更します。

Rakefileの内容

1require 'rake'2require 'rspec/core/rake_task'3require 'yaml'4require 'highline/import'56desc "Run serverspec to all hosts"7task :spec => 'serverspec:all'89namespace :serverspec do1011  ENV['TARGET_HOST_YML'] = ask("Enter Servers.yml(full path): ") { |q| q.echo = true } ←サーバ情報が書かれたymlファイルのパスを入力させて環境変数に設定します。12  properties = YAML.load_file(ENV['TARGET_HOST_YML']) ←ymlファイルを読み込みます。13  task :all => properties.keys.map {|key| 'serverspec:' + key.split('.')[0] }14  properties.keys.each do |key|15    desc "Run serverspec to #{key}"16    RSpec::Core::RakeTask.new(key.split('.')[0].to_sym) do |t|17      ENV['TARGET_HOST'] = key18      t.pattern = 'spec/{' + properties[key][:roles].join(',') + '}/*_spec.rb'19    end20  end21end

spec/spec_helper.rbの内容

1require 'serverspec'2require 'pathname'3require 'net/ssh'4require 'yaml'5require 'highline/import'6require 'kconv'78include Serverspec::Helper::Ssh9include Serverspec::Helper::DetectOS10include Serverspec::Helper::Properties1112properties = YAML.load_file(ENV['TARGET_HOST_YML']) ←Rakefileで入力された環境変数を設定します。1314RSpec.configure do |c|15  c.host  = ENV['TARGET_HOST']16  set_property properties[c.host]17  options = Net::SSH::Config.for(c.host)18  user    = 'root'19  c.ssh   = Net::SSH.start(c.host, user, options)20  c.os    = backend.check_os21end
  1. この状態で「rake spec」コマンドを実行するとテスト対象のサーバを記述したファイルを指定してテストを行うことができます。

まずgroupA.ymlをテストしてみます。

1$rake spec2Enter Servers.yml(full path): /usr/local/serverspec/groupA.yml ←サーバ情報が書かれているymlファイルを指定します。3/usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb4.56Finished in 0.02088 seconds71 example, 0 failures8/usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb9.1011Finished in 0.02216 seconds121 example, 0 failures13↑ymlファイルに書かれている2つのサーバに対してテストが実行される
  1. 次はgroupB.ymlをテストしてみます。
1$rake spec2Enter Servers.yml(full path): /usr/local/serverspec/groupB.yml ←同じくグループBのymlファイルを指定します。3/usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb4.56Finished in 0.00699 seconds71 example, 0 failures8↑groupB.ymlに書かれている1つのサーバに対してテストが実行される

いかがでしたか?

サーバのグループごとにファイルを分けることできっと管理しやすくなるはずです!

次回もお楽しみに!!

この記事を書いた人

aws-recipe-user