DesignAssembler

備忘録に近い

Serverspec

serverspec

serverspecは、Rubyで書けるサーバーの状態(ソフトウェアのインストール状況、起動状況、ファイルの存在等)をテストできるツールです。

文法はRubyRSpecのものが使えます。

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にあげました。

github.com

参考

qiita.com

とても良い・・・

qiita.com