読者です 読者をやめる 読者になる 読者になる

時と場合によりけり

日々のアップデートとイノベーションに翻弄され彷徨える IT エンジニアの覚書

macOS Sierra に設定した Vagrant VMを Serverspec でテストする

Ruby anyenv CentOS Vagrant Serverspec

概要

macOS Sierra に VirtualBoxVagrant を使って導入した仮想マシンCentOS 6.8 )のサーバー構成をテストしたいと思います。テストするためのツールは、Serverspec です。

VirtualBoxVagrant については、以下のエントリーを参考にしてみてください。

stangler.hatenablog.com

ホスト

  • マシン: Macbook Pro Early 2011
  • OS: macOS 10.12 Sierra
  • メモリ: 16 GB
  • ストレージ: SSD 512 GB
  • anyenv
  • rbenv 1.0.0-33-gc7dcaf1
  • rbenv-gemset v0.4.0
  • Ruby 2.3.1p112
  • Serverspec 3.5.0

ゲスト

ディレクトリおよびファイル構成

% pwd
/Users/xxxxx/Vagrant/dev-basic

% tree
.
├── Gemfile
├── Gemfile.lock
└── Vagrantfile

Serverspec

Severspec とは

Ruby on Rails でよく使われるテストフレームワークRspec というのがあります。そのサーバー版が、Serverspec です。

Serverspec - Home

Gemfile 編集

まずは、現在インストールされている gem を確認します。

% rbenv exec gem list
*** LOCAL GEMS ***

bigdecimal (1.2.8)
bundler (1.13.2)
did_you_mean (1.0.0)
io-console (0.4.5)
json (1.8.3)
minitest (5.8.3)
net-telnet (0.1.1)
open4 (1.3.4)
Platform (0.4.0)
popen4 (0.1.2)
power_assert (0.2.6)
psych (2.0.17)
rake (10.4.2)
rdoc (4.2.1)
sahara (0.0.17)
test-unit (3.1.5)

serverspec をインストールするには、rake が必要となります。
次に、Gemfile に serverspec を追加します。

% vim Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "sahara"
gem "rake"
gem "serverspec"

上記の Gemfile にある sahara は必須ではありません。Vagrant で環境構築する際に、便利なので入れておいてもよいかもです。ご興味のある方は、次のエントリーをご参照ください。

stangler.hatenablog.com

gem インストール

% rbenv exec bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 10.4.2
Using Platform 0.4.0
Installing diff-lcs 1.2.5
Installing multi_json 1.12.1
Installing net-ssh 3.2.0
Using net-telnet 0.1.1
Using open4 1.3.4
Installing rspec-support 3.5.0
Installing sfl 2.3
Using bundler 1.13.2
Installing net-scp 1.2.1
Using popen4 0.1.2
Installing rspec-core 3.5.4
Installing rspec-expectations 3.5.0
Installing rspec-mocks 3.5.0
Installing specinfra 2.63.2
Using sahara 0.0.17
Installing rspec-its 1.2.0
Installing rspec 3.5.0
Installing serverspec 2.36.1
Bundle complete! 3 Gemfile dependencies, 20 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
% rbenv rehash

Serverspec 初期化

それでは、Serverspec の設定を行っていきましょう。以下のコマンドを入力すると、対話形式で設定を始まります。

% rbenv exec 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/default/
 + spec/default/sample_spec.rb
 + Rakefile
 + .rspec

実行テスト

うまく動くかどうか、試しに使ってみましょう。上記の Serverspec 初期化で、sample_spec.rb というのが自動で生成されています。このサンプルテストを動かしてみます。

% rbenv exec bundle exec rake spec
/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/bin/ruby -I/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-core-3.5.4/lib:/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-support-3.5.0/lib /Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-core-3.5.4/exe/rspec --pattern spec/default/\*_spec.rb

Package "httpd"
  should be installed (FAILED - 1)

Service "httpd"
  should be enabled (FAILED - 2)
  should be running (FAILED - 3)

Port "80"
  should be listening (FAILED - 4)

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 chkconfig\ --list\ httpd\ \|\ grep\ 3:on

     # ./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 ps\ aux\ \|\ grep\ -w\ --\ httpd\ \|\ grep\ -qv\ grep

     # ./spec/default/sample_spec.rb:13:in `block (2 levels) in <top (required)>'

  4) Port "80" should be listening
     On host `default'
     Failure/Error: it { should be_listening }
       expected Port "80" to be listening
       sudo -p 'Password: ' /bin/sh -c netstat\ -tunl\ \|\ grep\ --\ :80\\\

     # ./spec/default/sample_spec.rb:27:in `block (2 levels) in <top (required)>'

Finished in 0.41816 seconds (files took 9.83 seconds to load)
4 examples, 4 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
rspec ./spec/default/sample_spec.rb:27 # Port "80" should be listening

/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/bin/ruby -I/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-core-3.5.4/lib:/Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-support-3.5.0/lib /Users/xxxxx/.anyenv/envs/rbenv/versions/2.3.1/gemsets/basic-set/gems/rspec-core-3.5.4/exe/rspec --pattern spec/default/\*_spec.rb failed

こんな感じで、テストが実行されれば、OK です。まだ、何も設定していないので、4つのサンプルテストは全て Failed となります。
以上です。