こんにちは!beardです!
Serverspecでは、複数のサーバを一括テストするために便利な方法があります。今回は、テスト項目ごとにコードを整理する方法も合わせてご紹介します。
Serverspecのインストールと基本的な操作については、過去の記事『Amazon OSS編~Serverspecパート①~』をご覧ください。
1. 今回テストする環境
Serverspecがインストールされたサーバから以下の二つのサーバをテストします。
サーバAにhttpdをインストールして稼動させ、OSの時刻設定をJSTにしています。
サーバBはその状態でAMIを取得したものからEC2インスタンスを立ち上げたので設定はまったく同じになります。
サーバAのIPアドレス:54.64.15.205
サーバBのIPアドレス:54.64.126.211
2. Serverspecがインストールされたサーバの/usr/local/serverspecに移動してserverspec-initをします。
その後テスト項目ごとにディレクトリを分けて配置します。
ディレクトリとファイル構成を以下のように変更します。
1 2 3 4 5 6 7 |
serverspec ├Rakefile ├spec | └web | └httpd_spec.rb ←****_spec.rbの形式のみserverspecで読み込まれる └ common └time_spec.rb ←****_spec.rbの形式のみserverspecで読み込まれる |
それぞれのファイルの中身は以下のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#httpd_spec.rb httpdが有効になっているかの確認 require 'spec_helper' describe package('httpd') do it { should be_installed } end describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end # time_spec.rb 時刻設定の確認 require 'spec_helper' describe command('date') do it { should return_stdout /JST/ } end |
3. サーバを複数まとめてテストするにはRakefileを編集します。
注意するべきはhostsの部分だけです。後はコピペで大丈夫です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
require 'rake' require 'rspec/core/rake_task' hosts = [ { :name => '54.64.15.205', ←テスト対象サーバAのhost名orIPアドレス :roles => %w( web common ), ←上のディレクトリ名がテスト項目になる }, { :name => '54.64.126.211', ←テスト対象サーバBのhost名orIPアドレス :roles => %w( web common ), ←上のディレクトリ名がテスト項目になる }, ] hosts = hosts.map do |host| { :name => host[:name], :short_name => host[:name].split('.')[0], :roles => host[:roles], } end desc "Run serverspec to all hosts" task :spec => 'serverspec:all' class ServerspecTask < RSpec::Core::RakeTask attr_accessor :target def spec_command cmd = super "env TARGET_HOST=#{target} #{cmd}" end end namespace :serverspec do task :all => hosts.map {|h| 'serverspec:' + h[:short_name] } hosts.each do |host| desc "Run serverspec to #{host[:name]}" ServerspecTask.new(host[:short_name].to_sym) do |t| t.target = host[:name] t.pattern = 'spec/{' + host[:roles].join(',') + '}/*_spec.rb' end end end |
4. spec_helper.rbも以下のように変更します。
ここではuser名だけ気をつけましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'serverspec' require 'net/ssh' include SpecInfra::Helper::Ssh include SpecInfra::Helper::DetectOS RSpec.configure do |c| c.host = ENV['TARGET_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 |
5. ではテストを実行します。
1 2 3 4 5 6 7 8 9 10 11 |
$rake spec env TARGET_HOST=54.64.15.205 /usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb spec/web/httpd_spec.rb ..... Finished in 0.19234 seconds 5 examples, 0 failures env TARGET_HOST=54.64.126.211 /usr/bin/ruby2.0 -S rspec spec/common/time_spec.rb spec/web/httpd_spec.rb ..... Finished in 0.16743 seconds 5 examples, 0 failures |
6. 複数のサーバがまとめてテストされました!
いかがでしたか。
今回は同じ構成のサーバが2台ですが、もっとサーバが増えたり、テスト項目をサーバごとに変えたりといった運用も可能です。
次回もお楽しみに!!