kidoOooOoooOOom

IT系で開発やってます

serverspec v2で複数ホストにrole別にtest実行

serverspec v1からv2でいくつか変更点があり、v1のソースではそのまま実行できない箇所があったので、変更点を見つつ v2 で基本的なテストを実行できるようにした。

ディレクトリ構成は下記の通り。最低限のwebのテストを用意する。

├── Gemfile
├── Gemfile.lock
├── Rakefile
├── properties.yaml
├── spec
│   ├── spec_helper.rb
│   └── web
│        └── node_spec.rb

Rakefile では ask を使って sshのusernameとpasswordを聞いておき、properties.yamlをロードしてホスト情報をRakeTaskに渡しておく。

require 'rake'
require 'rspec/core/rake_task'
require 'yaml'
require 'highline/import'

properties = YAML.load_file('properties.yaml')

ENV['SSH_USER'] = ask("Enter ssh user: ") { |q| q.echo = true }
ENV['SSH_PASSWORD'] = ask("Enter ssh password: ") { |q| q.echo = false }

desc "Run serverspec to all hosts"
task :serverspec => 'serverspec:all'

namespace :serverspec do
  task :all => properties.keys.map {|key| 'serverspec:' + key }
  properties.keys.each do |key|
    desc "Run serverspec to #{key}"
    RSpec::Core::RakeTask.new(key.to_sym) do |t|
      ENV['TARGET_HOST'] = properties[key][:hostname]
      t.pattern = 'spec/{' + properties[key][:roles].join(',') + '}/*_spec.rb'
    end
  end
end

properties.yaml では hostname と rolesを定義しておく

################################
#    staging
################################
stg-hoge-web01:
  :roles:
    - web
  :hostname: hogeweb01
stg-hoge-web02:
  :roles:
    - web
  :hostname: hogeweb02

spec_helper.rb で、ssh_optionsを組み立てて渡してあげる。
v2から使えるようになった記述にコメントしています。

# coding: utf-8

require 'serverspec'
require 'pathname'
require 'net/ssh'
require 'yaml'

set :backend, :ssh # v2から
set :path, '/sbin:/usr/sbin:$PATH' # v2から

RSpec.configure do |c|
  c.before :all do
    set :host, ENV['TARGET_HOST']
    options = Net::SSH::Config.for(c.host)
    options[:user] = ENV['SSH_USER']
    options[:password] = ENV['SSH_PASSWORD']
    set :ssh_options, options # v2から
  end
end

後は、テスト本体のコードをガリガリ書いていけばおk。
とりあえず確認用に簡単なテストコードを書いて実行すれば無事テスト通った。

require 'spec_helper'

describe package('nodejs') do
  it { should be_installed }
end

describe port(2000) do
  it { should be_listening }
end


Serverspec

Serverspec