configspec/serverspec でシェルスクリプトを生成できるようにした

specinfra で ShellScript backend に対応 したので、configspec や serverspec で実行されるコマンドをシェルスクリプト形式でダンプできるようになった。

例えば configspec の場合

require 'configspec'

include SpecInfra::Helper::ShellScript
include SpecInfra::Helper::RedHat

といった spec_helper.rb を用意して

require 'spec_helper'

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

といった内容の spec を書いて実行すると

#!/bin/sh

yum -y install httpd

こんな内容の spec.sh というファイルを生成してくれる。

また、serverspec の場合

require 'serverspec'

include SpecInfra::Helper::ShellScript
include SpecInfra::Helper::RedHat

といった spec_helper.rb を用意して

require 'spec_helper'

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

describe service('httpd') do
  it { should be_enabled   }
  it { should be_running   }
end

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

describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  it { should contain "ServerName users501" }
end

という serverspec-init で生成されるサンプルの spec を実行すると

#!/bin/sh

rpm -q httpd
chkconfig --list httpd | grep 3:on
service httpd status
netstat -tunl | grep -- :80\
test -f /etc/httpd/conf/httpd.conf
grep -q -- ServerName\ users501 /etc/httpd/conf/httpd.conf || grep -qF -- ServerName\ users501 /etc/httpd/conf/httpd.conf

こんな内容の spec.sh を吐き出してくれる。

さらに include SpecInfra::Helper::RedHatinclude SpecInfra::Helper::Solaris11 に変えると

#!/bin/sh

pkg list -H httpd 2> /dev/null
svcs -l httpd 2> /dev/null | egrep '^enabled *true$'
svcs -l httpd status 2> /dev/null | egrep '^state *online$'
netstat -an 2> /dev/null | grep -- LISTEN | grep -- \\.80\
test -f /etc/httpd/conf/httpd.conf
grep -q -- ServerName\ users501 /etc/httpd/conf/httpd.conf || grep -qF -- ServerName\ users501 /etc/httpd/conf/httpd.conf

といった感じで、Solaris 11 用のシェルスクリプトを吐き出してくれる。(実際にはパッケージ名が違ってそのままでは使えないだろうけど。)

serverspec の場合は、シェルコマンドだけじゃなく Ruby で処理してる部分もあるので、ダンプされるシェルスクリプトで serverspec がやってることをそのまま再現できるわけではないし、そもそもシェルスクリプトでダンプすることに意味があるのか、という感じだけど、specinfra 側で対応するだけで、configspec と serverspec 両方で使えるようになる、という実例として挙げてみた。