Immutable Infrastructure の有用性 - Togetter の流れの勢いで、インフラ系技術の流れ とか Rebuild: 25: Immutable Infrastructure (Naoya Ito, Gosuke Miyashita) とかで言ってたような、冪等性とか依存関係とかを考慮しないシンプルな Configuratin Management Tool である configspec をつくってみました。rubygems.org にもアップしてます。
この手のツールに自分が望む要件は以下の様な感じ。
使い方はこんな感じ。
$ configspec-init
Select a backend type:
1) SSH
2) Exec (local)
Select number: 1
Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: n
Input vagrant instance name: www
+ spec/
+ spec/www/
+ spec/www/001_httpd_spec.rb
+ spec/spec_helper.rb
+ Rakefile
~/tmp/configspec/spec
$ rake spec
/opt/boxen/rbenv/versions/2.0.0-p247/bin/ruby -S rspec spec/www/001_httpd_spec.rb
Package "httpd"
should be installed
Finished in 3.44 seconds
1 example, 0 failures
サンプルとして生成される 001_httpd_spec.rb
の中身はこんな感じ。
require 'spec_helper'
describe package('httpd') do
it { should be_installed }
end
これによって、rake spec
を実行すると、裏では yum -y install httpd
が実行される。
これを見て、serverspec とほぼ同じだ、と思った方、正解です。コードも serverspec からとほんどコピペしてます。違いは、be_installed
で実行されるのが、serverspec の場合は rpm -q
で、configspec では yum install -y
といったところぐらいですね。
この configspec は、とりあえず proof of concept として作ってみただけで、RedHat 系 OS でパッケージインストールしかできないので、まだまだ実用には耐えませんが、つくりが serverspec とまんま一緒なので、同じような感じで拡張していけます。
serverspec にこういった機能を組み込むことも考えましたが、serverspec のようにサーバの状態をテストするのと、configspec のようにサーバに副作用のある何かを実行するのでは、書くべき内容が異なってくるだろう、と考えて、別プロダクトにしました。
RSpec の副産物として副作用のある何かが実行されるというのは、もちろん Sitespec の影響受けてます。