あいつの日誌β

働きながら旅しています。

テスト駆動サーバ構築のススメ

あらすじ

猫も杓子もサーバーテストな今日この頃なのでそろそろそういうのをやっておきましょう。

大体 vagrant から始める感じみたいですが、学習効率を考えて最初に serverspec と戯れておくことにします。

私の Mac について

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.8.4
BuildVersion:   12E55

% httpd -v
Server version: Apache/2.2.23 (Unix)
Server built:   Jun 10 2013 12:01:00

install rbenv

% git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
% echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
% exec $SHELL -l

install ruby-build

% git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

動作確認

% rbenv install -l

install ruby

% rbenv install 1.9.3-p448
% rbenv global 1.9.3-p448
% rbenv rehash

insatll rbenv-rehash

% gem i rbenv-rehash

vim から呼び出しても正常かどうかを確認する

% ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]
% vim +\!ruby\ -v +q
:!ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12.4.0]

install serverspec

% gem install serverspec rake
% mkdir ~/ServerSpec
% cd ~/ServerSpec
% serverspec-init
Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 2

 + spec/
 + spec/localhost/
 + spec/localhost/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

テスト実行。

% rake spec

盛大にこける。どうやら serverspec/commands/darwin.rb を見る限り serverspec/commands/base.rb で定義している be_installed といった関数を上書きする必要があるらしいがまだ実装されていないようだ。

という事で練習開始

とりあえず今回は練習なので ~/ServerSpec/lib/severspec/commands/darwin.rb を追加してみました。httpd -v というコマンドを実行して期待通りの結果になるかをテストします。

% cat ~/ServerSpec/lib/severspec/commands/darwin.rb
require 'shellwords'

module Serverspec
  module Commands
    class Darwin < Base
      def check_installed(package,version=nil)
        cmd = "#{escape(package)}"
        if ! version.nil?
          cmd = "#{cmd} -v | grep -w -- #{escape(version)}"
        end 
        cmd 
      end 
    end 
  end 
end

~/ServerSpec/spec/localhost/httpd_sepc.rb を以下のように編集。 他の箇所は使わないのでコメントアウトしたり削除したりしてください。

% cat ~/ServerSpec/spec/localhost/httpd_sepc.rb
require 'spec_helper'

describe package('httpd', '2.23') do
  it { should be_installed.with_version('2.23')  }
end

テスト実行

% rake spec
okamuuu/.rbenv/versions/1.9.3-p448/bin/ruby -S rspec spec/localhost/httpd_spec.rb
.

Finished in 0.0622 seconds
1 example, 0 failures

おめでとうございます。

まとめ

vagrant だとか chef だとか次々と新しい言葉を聞かされてもよく理解できなかったりするので、そんな人はとりあえず serverspec からはじめてもいいんじゃないでしょうか?