serverspec でホスト固有の属性値を扱う方法

注意! v0.11.0 からは attr, attr_set ではなく、property, set_property とメソッド名が変更されています。attr, attr_set は近い将来使えなくなります。最新の情報はこちらを参照してください

注意! ここで解説する方法は v0.3.0 から利用できます。

Provisioning Frameworks Casual Talks vol.1 に行ってきた #pfcasual - TAKUMI SAKAMOTO'S BLOG で触れられている attributes 周りについて、この辺は必要になるだろうなー、と前から思ってはいたので、それを実現するための極々簡単な仕組みを 試験的に実装してみた

これは単に attr_setattr という2つのヘルパーメソッドを使えるようにしただけのものなんだけど、以下のような感じで使える。

今回は例として、ホスト毎に MySQL の server-id が外部ファイルで定義されていて、各サーバの /etc/my.cnf で正しく server-id が設定されているかをテストする、という状況を想定する。

属性値の定義は、今回は YAML ファイルで行うので、以下のような YAML ファイルを用意する。

次に、serverspec のテストをホスト間で共有する方法 と似たような感じで、YAML で定義されたロールに応じて適切なテストを行うような Rakefile を書く。

そして spec_helper.rb を以下のように書く。

attr_set attributes[c.host] で属性値のセットを行っている。

最後に、属性値を参照して attr[:server_id]/etc/my.cnf で定義されているかどうかをテストする spec を書く。

仕組みは単純なので、YAML.load_file している部分を好きなように変えれば、自身の環境に合った使い方ができるでしょう。