Chefで書いたレシピをテストする(serverspec)

こんにちは。小宮です。

今回で最終回です。
前回までにご紹介したレシピのテストするところをご紹介します。Serverspecを用います。

なぜServerspecがいいかというのは以下リンクにも書いてますが、以下の点がよいと思います。
・Chefのテストツールでなく外部のツールなので依存関係がない(puppetでも使える)
・設計思想がシンプル簡単に使えるものということで、手間があんまりなくて簡単につかえた

参考:
Serverspec at hbstudy #45
入門Chef Solo落ち穂拾い
kayac/newbie-training
「入門Puppet」
resource_typeのマニュアル
advanced_tips
ncstudy#05 ハンズオン資料
parallel_tests

・セットアップ
バージョン0.3と0.6だとテストの書き方が若干違う感じだったので、マニュアルに沿ってる新しいほうを推奨します。
[shell]# yum install rubygems

gem install serverspec rake

serverspec-init

[shell]# serverspec-init
~略~
Input target host name: 10.0.0.240
+ spec/10.0.0.240/
+ spec/10.0.0.240/httpd_spec.rb[/shell]

SSHを指定し、ターゲットホストを入力すると、ホスト毎のディレクトリが作成されました。

テストを書いていきます。

[shell]# vi spec/10.0.0.240/httpd_spec.rb
require ‘spec_helper’

[shell]# vi spec/spec_helper.rb
include Serverspec::Helper::RedHat[/shell]

sshのconfigを修正して接続情報を渡せるようにします
[shell]# vi .ssh/config
Host 10.0.0.240
HostName 10.0.0.240
User root
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile "/root/.ssh/komi-test.pem"
IdentitiesOnly yes
LogLevel FATAL
Host 10.0.0.241
HostName 10.0.0.241
User root
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile "/root/.ssh/komi-test.pem"
IdentitiesOnly yes[/shell]

db側のテストファイル名を修正して内容も実体に合わせて修正します
[shell]# mv spec/10.0.0.241/httpd_spec.rb spec/10.0.0.241/mysqld_spec.rb

vi spec/10.0.0.241/mysqld_spec.rb

[shell]# rake spec
(in /root)
/root/.rbenv/versions/1.9.2-p290/bin/ruby -S rspec spec/10.0.0.240/httpd_spec.rb spec/10.0.0.241/mysqld_spec.rb
…………

[shell]Failures:

    とりあえずクックブック単位にテストファイルを分けることにします。
たぶんホストディレクトリ毎に適当にレシピに対応した名前のテストファイルを作ってけば大丈夫です。
base_settingのレシピのテストは重複するのでロール毎に管理したいとかありますが今後の課題となります。

[shell]# vi spec/10.0.0.240/base_spec.rb
require ‘spec_helper’

rake spec

[shell]# cp -p spec/10.0.0.240/base_spec.rb spec/10.0.0.241/

vi spec/10.0.0.241/base_spec.rb

diff spec/10.0.0.240/base_spec.rb spec/10.0.0.241/base_spec.rb

・httpdのクックブックのテストを少し書きくわえた
[shell]require ‘spec_helper’

・mysqldのテストを少し追加
[shell]require ‘spec_helper’

[shell]# vi spec/10.0.0.240/munin_spec.rb
require ‘spec_helper’

cp -p spec/10.0.0.240/munin_spec.rb spec/10.0.0.241/munin_spec.rb

vi spec/10.0.0.241/munin_spec.rb

diff spec/10.0.0.240/munin_spec.rb spec/10.0.0.241/munin_spec.rb

[shell]# vi spec/10.0.0.240/zabbix_spec.rb
require ‘spec_helper’

cp -p spec/10.0.0.240/zabbix_spec.rb spec/10.0.0.241/zabbix_spec.rb

rake spec

ユーザとかreplicationとかのテストはかいてないがcommandリソースタイプで標準出力をチェックするしかなさそう。
コマンドがこれ↓で、
mysql -u root -pcat /path_to_file -s -e “show grants for repl@’10.0.0.%’;”
戻り値がこれ↓というテストを書くくらいしか思いつかない
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘repl’@’10.0.0.%’ IDENTIFIED BY PASSWORD ‘*43E209EED080057E35C2630AC06D3296*****’
複雑なやつは戻り値がシンプルなチェックコマンド作っておく感じになるんでしょうか。。

こんな情報も
・rake spec SPEC_OPTS=”–format html”でHTML出力ができる。エラーでないとOKしか帰ってこないのでレポートがほしい場合等に視認性がいい感じです。
・gem install ci_reporterでRakefileにrequire ‘ci/reporter/rake/rspec’追記で
 JUnit 形式の XML (Jenkins で利用可能) へ変換できる
parallel_testsつかうと並列実行できて早い。台数多いときよさそうです。
・ロールやattribute的なものを使いたい場合は以下のサイトが参考になりそうです。
 advanced_tips
 serverspec でホスト固有の属性値を扱う方法
 Serverspecでchefのjsonを読み込む
 serverspecでサーバ環境のテストを書いてみよう

長編Chefシリーズはこれでおしまいです。
では長々見ていただいてありがとうございました。

バックナンバーはこちら↓
 Chef-SoloとVagrantの導入(VPC環境)
 Chef-Soloでレシピを書く前の環境について(Vagrantfile,role,node,data_bags)
 Chefで既存手順のレシピを書く1(初期設定)
 Chefで既存手順のレシピを書く2(ユーザ作成)
 Chefで既存手順のレシピを書く3(WEBサーバ)
 Chefで既存手順のレシピを書く4(DBサーバ)
 Chefで既存手順のレシピを書く5(munin、zabbix)
 Chefで書いたレシピをテストする(serverspec)

おすすめ記事