More than 1 year has passed since last update.

概要

Serverspecとは、サーバーの状態、設定などのテストを自動化するツールです。
RubyのRSpecのような使い方ができます。
実行するにはrubyが必要になります。

今回はその構築手順を書きます。
specの書き方についてはこちらを。
Serverspec書き方メモ

環境

  • ruby 2.3.3.
  • rake 12.0.0
  • serverspec 2.38.0

環境構築手順

rubyがインストールされていることが前提となります。
関連:rbenv, rubyのインストール

gemのインストール

適当にserverspec用のディレクトリを作成して、Gemfileを作成して bundle install してください。

Gemfile
source "https://rubygems.org"

gem 'serverspec'
gem 'rake'
gem 'highline'
$ bundle install --path vendor/bundle

Serverspecのインストール

このコマンドで必要なファイルと、サンプルのテストコードが作成される。
サンプルは不要であれば削除してください。

$ bundle exec serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: example.com
 + spec/
 + spec/example.com/
 + spec/example.com/sample_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 + .rspec

Vagrant instance y/n: y にすると、テスト実行時に自動で vagrant up されて、
その中でテストが実行されるというようなことができるみたいだが、未確認。
参考:vagrant-serverspecを使ってサーバをテストする。

test実行

テストコードができたら、下記コマンドでテストを実行してください。
ASK_SUDO_PASSWORD はテスト対象サーバーでsudoをする必要があるなら付けてください。

$ bundle exec rake
$ ASK_SUDO_PASSWORD=1 bundle exec rake

RSpecのように、テストの成功、失敗が表示されます。

Finished in 0.4053 seconds (files took 0.23084 seconds to load)
73 examples, 0 failures

複数ホストに対応

前述の方法では、テスト対象サーバーが一つのときにしか対応できません。
下記の方法であれば、同じテストを、複数台のサーバーへ流すことができます。

以下のファイルを書き換えます。

Rakefile

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

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

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'
      t.fail_on_error = false
    end
  end
end

spec/spec_helper.rb

spec/spec_helper.rb
require 'serverspec'
require 'pathname'
require 'net/ssh'
require 'yaml'

set :backend, :ssh
set :path, '/sbin:/usr/sbin:$PATH'

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
  end
end

properties.yml

新規に作る。チェック対象のホストを記載する。

properties.yml
sample-host-01:
  :roles:
    - pc/nginx
    - pc/firewall
  :hostname: sample-host-01.com

sample-host-02:
  :roles:
    - pc/nginx
    - pc/firewall
  :hostname: sample-host-02.com

hostname

テスト対象サーバーの接続先情報。IPアドレスでもOK。

roles

実施するテスト項目。上記の例だと、
下記のディレクトリの下にある *_spec.rb を全て実行する。

  • spec/pc/nginx
  • spec/pc/firewall

テスト実行

実行コマンドは、 bundle exec rake ではなく下記になります。

$ bundle exec rake serverspec

specの書き方はこちら
Serverspec書き方メモ

以上

参考

http://serverspec.org/
さくらのナレッジ 「Serverspec」を使ってサーバー環境を自動テストしよう
serverspec v2で複数ホストにrole別にtest実行
Serverspecで複数ホストのテストをする時、途中でfailしても、最後までspecを実行させる。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.