configspec という Immutable Infrastructure 用 Configuration Management Tool をつくってみた

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 の影響受けてます。