こんにちは!beardです!
Serverspecでファイルにテスト対象のサーバ情報を記述しておきたい場合、ちょっとした工夫が必要でした。
今回は、テストするときにファイルを指定してServerspecを実行する方法をご紹介します。
Serverspecのインストールと基本的な操作については、過去の記事『Amazon OSS編~Serverspecパート①~』をご覧ください。
1. 今回テストする環境
例としてServerspecから2つのサーバのグループをテストします。
グループAに2台のサーバ、グループBに1台のサーバとしています。
今回はファイルを分けてサーバ情報を記述することを目的としているので、テスト内容は時刻が日本時間になっていること確認するだけです。
テスト対象のサーバをグループごとにymlファイルにまとめます。
テスト項目のディレクトリ構成は『Serverspecで複数のサーバを一括テストする方法』の記事と同じです。
ディレクトリ構成
1 2 3 4 5 6 7 |
Serverspec ├Rakefile ├groupA.yml ←グループAの情報を記述 ├groupB.yml ←グループBの情報を記述 ├spec └ common └time_spec.rb ←時刻設定のテスト。今回使います。 |
/usr/local/serverspec/groupA.ymlの内容
1 2 3 4 5 6 |
54.64.126.211: :roles: - common 54.64.15.205: :roles: - common |
/usr/local/serverspec/groupB.ymlの内容
1 2 3 |
54.64.93.240: :roles: - common |
2. これだけではファイルを読み込んでくれませんので、Rakefileとspec/spec_helper.rbを以下のように変更します。
Rakefileの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
require 'rake' require 'rspec/core/rake_task' require 'yaml' require 'highline/import' desc "Run serverspec to all hosts" task :spec => 'serverspec:all' namespace :serverspec do ENV['TARGET_HOST_YML'] = ask("Enter Servers.yml(full path): ") { |q| q.echo = true } ←サーバ情報が書かれたymlファイルのパスを入力させて環境変数に設定します。 properties = YAML.load_file(ENV['TARGET_HOST_YML']) ←ymlファイルを読み込みます。 task :all => properties.keys.map {|key| 'serverspec:' + key.split('.')[0] } properties.keys.each do |key| desc "Run serverspec to #{key}" RSpec::Core::RakeTask.new(key.split('.')[0].to_sym) do |t| ENV['TARGET_HOST'] = key t.pattern = 'spec/{' + properties[key][:roles].join(',') + '}/*_spec.rb' end end end |
spec/spec_helper.rbの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
require 'serverspec' require 'pathname' require 'net/ssh' require 'yaml' require 'highline/import' require 'kconv' include Serverspec::Helper::Ssh include Serverspec::Helper::DetectOS include Serverspec::Helper::Properties properties = YAML.load_file(ENV['TARGET_HOST_YML']) ←Rakefileで入力された環境変数を設定します。 RSpec.configure do |c| c.host = ENV['TARGET_HOST'] set_property properties[c.host] options = Net::SSH::Config.for(c.host) user = 'root' c.ssh = Net::SSH.start(c.host, user, options) c.os = backend.check_os end |
3. この状態で「rake spec」コマンドを実行するとテスト対象のサーバを記述したファイルを指定してテストを行うことができます。
まずgroupA.ymlをテストしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$rake spec Enter Servers.yml(full path): /usr/local/serverspec/groupA.yml ←サーバ情報が書かれているymlファイルを指定します。 /usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb . Finished in 0.02088 seconds 1 example, 0 failures /usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb . Finished in 0.02216 seconds 1 example, 0 failures ↑ymlファイルに書かれている2つのサーバに対してテストが実行される |
4. 次はgroupB.ymlをテストしてみます。
1 2 3 4 5 6 7 8 |
$rake spec Enter Servers.yml(full path): /usr/local/serverspec/groupB.yml ←同じくグループBのymlファイルを指定します。 /usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb . Finished in 0.00699 seconds 1 example, 0 failures ↑groupB.ymlに書かれている1つのサーバに対してテストが実行される |
いかがでしたか?
サーバのグループごとにファイルを分けることできっと管理しやすくなるはずです!
次回もお楽しみに!!