読者です 読者をやめる 読者になる 読者になる

serverspecの出力結果を少し見やすくする

Ruby

RSpecに馴染みがないからか、serverspecの出力結果(特にエラーは)は正直見づらい。もちろん全てパスするのが前提だから、failした時点でそれどうなのよって話なんだけど、サーバの台数やテストの数が多いと結構おかしなところが見つかる。(そして目を細めて画面を見てあーここかーって)

何かいい方法はないものかと思っていたところ、Rebuild ep29rspec-fsというオプションを渡すと自然言語っぽいアウトプットになるといういいこと(常識?)を聞いたのでserverspecで試してみた。

調べたところやり方が2通りあって、コマンドラインSPEC_OPTS="--format doc" を渡すかRakefileに直書きすればいいらしい。(ドキュメントでは-fd [--format documentation]と書いてあったけど-fsでも同じ結果になった。)

$ rake serverspec SPEC_OPTS="-fd"

または

require 'rake'
require 'rspec/core/rake_task'
require 'json'

properties = JSON.parse(File.read('target.json'))

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|
      t.rspec_opts = ['--format documentation']   #ここ
      ENV['TARGET_HOST'] = key
      puts "HOSTNAME: #{key}"
      t.pattern = 'spec/{' + properties[key]["roles"].join(',') + '}/*_spec.rb'
    end
  end
end

といった感じでオプションが渡せる。

これでserverspecを実行すると以下のように一覧が追加されて見やすくなった。

$ rake serverspec SPEC_OPTS="-fd"
HOSTNAME: 192.168.1.2
/Users/me/.rbenv/versions/2.0.0-p247/bin/ruby -S rspec spec/common/base_spec.rb spec/common/hw_spec.rb

Command "uname -i"
  should return stdout "x86_64"

SELinux
  should be disabled

File "/etc/resolv.conf"
  should contain /127\.0\.0\.1/
  should contain /8\.8\.8\.8/
  should contain /8\.8\.4\.4/

Command "fdisk -lu | grep ^\/dev | sort -k1 | head -n2"
  should return stdout /2048/ (FAILED - 1)
  should return stdout /2101247/ (FAILED - 2)
  should return stdout /1049600/ (FAILED - 3)
  should return stdout /2101248/ (FAILED - 4)

Cron
  should have entry "0 5 * * * /root/bin/foo.sh" (FAILED - 5)

Cron
  should have entry "*/30 * * * * /root/bin/bar.sh" (FAILED - 6)

Command "svstat /service/dnscache | awk '{print $2}'"
  should return stdout "up"

Command "svstat /service/dnscache | awk '{print $5}'"
  should return stdout /^\d\d\d+$/

Port "53"
  should be listening

Service "ntpd"
  should be enabled
  should be running

Port "123"
  should be listening

File "/etc/ntp.conf"
  should contain "time.somewhere.com"

Command "getconf _NPROCESSORS_ONLN"
  should return stdout "8"

Command "dmidecode --type memory | grep Size | awk '{sum += $2}END{print sum}'"
  should return stdout "4096" (FAILED - 7)

Interface "eth0"
  speed
    should eq 1000 (FAILED - 8)

Interface "eth1"
  speed
    should eq 1000 (FAILED - 9)

.....

ついでにspec_helper.rbで色を付けると更に見やすくなる。

RSpec.configure do |c|
  ...
  c.color_enabled = true
  ...
end

こういうオプションとかルビーストにとっては当たり前のことかもしれないけど、ChefやserverspecからRubyを触り出した僕はその当たり前が分からないので辛い。

参考

http://qiita.com/snaka/items/e0808f9cfbad87c49b4e

https://www.relishapp.com/rspec/rspec-core/v/2-14/docs/command-line/format-option