Serverspec BuildStatus Coverage Status

RSpec tests for your servers provisioned by Puppet, Chef or anything else


Installation

Add this line to your application's Gemfile:

gem 'serverspec'

And then execute:

$ bundle

Or install it yourself as:

$ gem install serverspec

Usage

$ serverspec-init
Input target host name: www.example.jp

Select OS Type of target host:

  1) Red Hat
  2) Debian
  3) Gentoo
  4) Solaris
  5) None

Select number: 1

 + spec/
 + spec/www.example.jp/
 + spec/www.example.jp/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

spec/www.example.jp/httpd_spec.rb is a sample spec file and its content is like this.

require 'spec_helper'

describe 'httpd' do
  it { should be_installed }
  it { should be_enabled   }
  it { should be_running   }
end

describe 'port 80' do
  it { should be_listening }
end

describe '/etc/httpd/conf/httpd.conf' do
  it { should be_file }
  it { should contain "ServerName www.example.jp" }
end

You can write spec for testing servers like this.

You should create ~/.ssh/config like this before running tests because serverspec tests servers through SSH access.

Host *.example.jp
   User root
   IdentityFile ~/.ssh/id_rsa
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null

Run tests.

$ rake spec
/usr/bin/ruby -S rspec spec/www.example.jp/httpd_spec.rb
......

Finished in 0.99715 seconds
6 examples, 0 failures

Multi OS support

Serverspec is supporting Red Hat based OS, Debian based OS, Gentoo and Solaris now.

If your target host's OS is Debian, you should include Serverspec::DebianHelper like this.

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

RSpec.configure do |c|
  # Include OS helper
  c.include(Serverspec::DebianHelper)
  c.before do
    host  = File.basename(Pathname.new(example.[:location]).dirname)
    if c.host != host
      c.ssh.close if c.ssh
      c.host  = host
      options = Net::SSH::Config.for(c.host)
      user    = options[:user] || Etc.getlogin
      c.ssh   = Net::SSH.start(c.host, user, options)
    end
  end
end

And you can omit OS type from spec like this.

require 'spec_helper'

describe 'httpd' do
  it { should be_installed }
  it { should be_enabled   }
  it { should be_running   }
end

describe 'port 80' do
  it { should be_listening }
end

describe '/etc/httpd/conf/httpd.conf' do
  it { should be_file }
  it { should contain "ServerName www.example.jp" }
end

You can change the target host's OS per spec like this.

require 'spec_helper'

describe 'httpd', :os => :debian do
  it { should be_installed }
  it { should be_enabled   }
  it { should be_running   }
end

describe 'port 80', :os => :debian do
  it { should be_listening }
end

describe '/etc/httpd/conf/httpd.conf', :os => :debian do
  it { should be_file }
  it { should contain "ServerName www.example.jp" }
end

Or like this.

require 'spec_helper'

describe 'www.example.jp', :os => :debian do
  it do
    'httpd'.should be_installed
  end

  it do
    'httpd'.should be_enabled
  end

  it do
    'httpd'.should be_running
  end

  it do
    'port 80'.should be_listening
  end

  conf = '/etc/httpd/conf/httpd.conf'

  it do
    conf.should be_file
  end

  it do
    conf.should contain "ServerName www.example.jp"
  end
end

Or modify spec/spec_helper.rb generated by serverspec-init command like this

Choose any style you like.


Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request