[Vagrant & VirtualBox] Serverspec 入門
以前に作った vagrant ファイルにテストを追加します。
Contents
インストール
gem install
もしくは Gemfile に下記のように記載する。
rake もインストールする必要があります。
gem "chef", "11.16.0"
gem "knife-solo"
gem "serverspec", "~>2.8.2"
gem "rspec", "~>3.2.0"
gem "rake", "~>10.4.2"
bundle install を実行する。
% bundle install --path vendor/bundle
プロジェクトを初期化する
% bundle exec serverspec-init
Select OS type:
1) UN*X
2) Windows
Select number: 1
Select a backend type:
1) SSH
2) Exec (local)
Select number: 1
Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: y
+ spec/
+ spec/default/
+ spec/default/sample_spec.rb
+ spec/spec_helper.rb
+ Rakefile
+ .rspec
サンプルファイルも生成されるので、早速実行します。
テストを実行する
bundle exec rake spec
を実行するとうまく動きません。
% bundle exec rake spec
rake aborted!
Circular dependency detected: TOP => spec => spec:all => spec:default => spec:all
Tasks: TOP => spec => spec:all => spec:default
(See full trace by running task with --trace)
Circular dependency detected に対応
こちらを参考に task :default => :all
をコメントアウトします。
# task :default => :all
再度実行するとうまく動いたようです。
% bundle exec rake spec
:
Package "httpd"
should be installed
Service "httpd"
should be enabled
should be running
Port "80"
should be listening
Finished in 1.01 seconds (files took 20.28 seconds to load)
4 examples, 0 failures
現行バージョンで動かない理由など、このあたり解決できず。
vagrant-serverspec
vagrant provision 時に serverspec が実行されるように、plugin をインストールしましたが、エラーを解決できないのでペンディング。
% vagrant plugin install vagrant-serverspec
Vagrantfile に serverspec の設定を追加します。
Vagrant.configure('2') do |config|
:
# serverspec
config.vm.provision :serverspec do |spec|
spec.pattern = 'spec/**/*_spec.rb'
end
end
実行すると NoMethodError
% vagrant provision
:
==> default: Running provisioner: serverspec...
/Users/****/projects/VMs/Zend/spec/spec_helper.rb:5:in `<top (required)>': undefined method `set' for main:Object (NoMethodError)
:
*_spec.rb にテストを追加する
こちらを参考にテストを追加してみます。
Resource Types を利用していきます。
yumrepo
yumrepo の存在と設定を確認。
describe yumrepo('remi') do
it { should exist }
it { should_not be_enabled }
end
package
package がインストールされているか。
describe package('php') do
it { should be_installed }
# it { should be_installed.with_version "5.5" }
end
php_config という Resource Types もあります。
command
command の実行結果を正規表現で。
describe command('php -v') do
its(:stdout) { should match /^PHP 5\.5\./ }
end
host
host を確認。
describe host('php.local') do
it { should be_resolvable.by('hosts') }
end
file
file を確認し、指定した内容が含まれているか。
配列も利用できる。
describe file('/etc/httpd/conf/httpd.conf') do
it { should be_file }
%w(php zf1 zf2).each do |h|
its(:content) { should match /ServerName #{h}.local/ }
its(:content) { should match /DocumentRoot \/vagrant\/www\/#{h}\/public/ }
end
end
などなど。
補遺
参考にさせて頂きました。