いろいろな記事や書籍で記述が揺らいでいたので、一番minimalな手順を探ったのでメモ。
前提
ChefとKitchenの設定は済んでいてkitchen converge
までが問題なく成功する状態とします。目的のレシピは書かれていて、Berksfileや.kitchen.ymlの設定は済んでいる状態。serverspec-init未使用。
serverspecをインストール。自分の環境では以下。sudo
やbundle exec
はお好みで。(私はつけない派)
$ gem install serverspec
バージョンや実行環境は以下のとおり
OS X 10.10 Yosemite
Ruby 2.1.3p242
Chef 11.16.4
Vagrant 1.6.3
serverspec 2.3.1
ディレクトリ構成
まずは自分の実環境から。/
はchefrepoのルートです。
/test/integration/default/serverspec/base_spec.rb
/test/integration/default/serverspec/apache_spec.rb
/test/integration/[テストsuite名]/[テストライブラリの名前]/[テストファイル]
実環境だと以下のようになりました。
/test/integration/default/serverspec/base_spec.rb
テストsuite名
「テスト一式の名前」として理解している。.kitchen.ymlに書かれているsuiteという部分。kitchen init
のデフォルトだとdefault
となるかと思います。
---
driver:
name: vagrant
provisioner:
name: chef_solo
platforms:
- name: centos-6.5
suites:
- name: default # <- ここです
run_list:
- recipe[base]
- recipe[apache]
attributes:
テストライブラリ名
テストライブラリの名前。bats
やminitest
が使えるらしい。今回はserverspec
と記述。batsもシェルスクリプトで直感的にかけるのでおすすめ。
テストファイル
実際にテストを記述するファイル。_spec.rb
で終わる必要がある。自分はrecipeの名前にするとわかりやすかったので上のような命名。
テストコード
packageの確認だけやります。
require 'serverspec'
%w{vim-common tree}.each do |pkg|
describe package(pkg) do
it { should be_installed }
end
end
require 'serverspec'
describe package('httpd24-httpd') do
it { should be_installed }
end
Chefのレシピの書き方と非常に似ています。
ちょっと注意
レシピの方で
package 'vim' do
action :install
end
と書いても、テストコードで
describe package('vim-common') do
it { should be_installed }
end
と実際のパッケージの名前を書かなきゃいけない。 ここが非対称でややこしい。インストールは簡単だけどテストはきちんと全て明示する、みたいな。
実行
$ cd [chefrepoのルート]
$ kitchen test
事前にkitchen converge
で仮想マシンが煮立っているならkitchen verify
でよい。
実行結果は以下。
$ kitchen verify
-----> Starting Kitchen (v1.2.1)
-----> Verifying <default-centos-65>...
Removing /tmp/busser/suites/serverspec
Uploading /tmp/busser/suites/serverspec/apache_spec.rb (mode=0644)
Uploading /tmp/busser/suites/serverspec/base_spec.rb (mode=0644)
-----> Running serverspec test suite
/opt/chef/embedded/bin/ruby -I/tmp/busser/suites/serverspec -I/tmp/busser/gems/gems/rspec-support-3.1.2/lib:/tmp/busser/gems/gems/rspec-core-3.1.7/lib /opt/chef/embedded/bin/rspec --pattern /tmp/busser/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/busser/suites/serverspec
Package "httpd24-httpd"
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
should be installed
Package "vim-common"
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
should be installed
Package "tree"
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
No backend type is specified. Fall back to :exec type.
should be installed
Finished in 0.20124 seconds (files took 0.27194 seconds to load)
3 examples, 0 failures
Finished verifying <default-centos-65> (0m2.30s).
-----> Kitchen is finished. (0m3.81s)
疑問
一応ここまでの手順で通るテストが書けるようになったものの、No backend type is specified. Fall back to :exec type.
が大量に出てくる。解決法がまだわからない。
backend typeというのはおそらくserverspec-init
をしたときに問われる SSH or Execなのかなと推測はできるが、どう指定したらいいのか。serverspec-init
と同様の構成にしたほうがいいのか。もう少し実験が必要か。情報求む。
参考資料
「Chef実践入門」
http://kitchen.ci/docs/getting-started/writing-test
http://kitchen.ci/docs/getting-started/adding-suite