serverspec
serverspecは、Rubyで書けるサーバーの状態(ソフトウェアのインストール状況、起動状況、ファイルの存在等)をテストできるツールです。
serverspecのセットアップ
serverspecを使うにはRubyが必要です。
gemで配られているので以下のコマンドでインストールします。
$ gem install serverspec
次に、serverspec-initします。ここで質問が表示されるので答えます。
$ 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
Rakefileを見ると、specのサブディレクトリ内の*_spec.rbを読み込むと書いています。
ここではspec/default/です。
とりあえず実行する
以下のコマンドでテストを実行します
$ rake
httpdはインストールしてないので失敗します。
should be installed (FAILED - 1)
Service "httpd"
should be enabled (FAILED - 2)
should be running (FAILED - 3)
Port "80"
should be listening
Failures:
1) Package "httpd" should be installed
On host `default'
Failure/Error: it { should be_installed }
expected Package "httpd" to be installed
sudo -p 'Password: ' /bin/sh -c rpm\ -q\ httpd
package httpd is not installed
# ./spec/default/sample_spec.rb:4:in `block (2 levels) in <top (required)>'
2) Service "httpd" should be enabled
On host `default'
Failure/Error: it { should be_enabled }
expected Service "httpd" to be enabled
sudo -p 'Password: ' /bin/sh -c systemctl\ --quiet\ is-enabled\ httpd
# ./spec/default/sample_spec.rb:12:in `block (2 levels) in <top (required)>'
3) Service "httpd" should be running
On host `default'
Failure/Error: it { should be_running }
expected Service "httpd" to be running
sudo -p 'Password: ' /bin/sh -c systemctl\ is-active\ httpd
unknown
# ./spec/default/sample_spec.rb:13:in `block (2 levels) in <top (required)>'
Finished in 0.3176 seconds (files took 7.74 seconds to load)
4 examples, 3 failures
Failed examples:
rspec ./spec/default/sample_spec.rb:4 # Package "httpd" should be installed
rspec ./spec/default/sample_spec.rb:12 # Service "httpd" should be enabled
rspec ./spec/default/sample_spec.rb:13 # Service "httpd" should be running
インストールしたのはnginxなのでテストを書き換えます。 (TDD的には順序が逆)
テストを書く
まずspec/default/sample_spec.rbを削除します。
そしてspec/default/serverspec_for_vagrant_spec.rbを作成します。
実施したいテストは
- nginxがインストールされているか
- nginxが起動しているか
- /etc/nginx/nginx.confがあるか
- ポート80が開いているか
- rubyがインストールされているか
- railsがインストールされているか
- mysqlがインストールされているか
- ユーザーが作成されているか
- データベースが作成されているか
以下はインストール確認です
#spec/default/serverspec_for_vagrant_spec.rb require 'spec_helper' # ポート describe port(80) do it { should be_listening } end # インストールされているパッケージ ['nginx','ruby','mysql'].each do |pkg| describe package(pkg), :if => os[:family] == 'redhat' do it { should be_installed } end end # インストールされているgem ['rails'].each do |gem_pkg| describe package(gem_pkg) do it { should be_installed.by('gem') } end end # ファイルの存在確認 ['/etc/nginx/nginx.conf'].each do |file| describe file(file) do it { should be_file } end end
次に、mysql関連のテストです spec/default/mysql_spec.rbを作成してください
#spec/default/mysql_spec.rb require 'spec_helper' # ユーザーが作成されているか # ユーザー名にChefのattribute使いたい # 分かる人教えてください・・・ describe command('mysqlshow -u dev_user --password=develop_password') do its(:stdout) { should match /Databases/ } its(:stdout) { should match /development/ } end
上のDatabasesでユーザー確認して、下のdevelopmentでデータベース確認しています。
もう少し良い方法がありそうです。
実行
上の設定で実行して成功すると以下のような出力が得られます。
Command "mysqlshow -u dev_user --password=develop_password"
stdout
should match /Databases/
stdout
should match /development/
Port "80"
should be listening
Package "nginx"
should be installed
Package "ruby"
should be installed
Command "which mysql"
exit_status
should eq 0
Command "which rbenv"
exit_status
should eq 0
Package "rails"
should be installed
File "/etc/nginx/nginx.conf"
should be file
Finished in 0.92472 seconds (files took 11.15 seconds to load)
9 examples, 0 failures
最後に
chefでvagrantの環境構築は以上です。
作ったファイルをgithubにあげました。
参考
とても良い・・・