hidemium's blog

日々学んだことをアウトプットする。

serverspecで構築したサーバの状態をテストする

Chefでプログラマブルなサーバ構築ができるようになったため、構築後のサーバの状態をプログラマブルにテストするために、serverspecをインストールしてみました。

構成

  • CentOS 6.5 : serverspecをインストール
  • Ubuntu 12.04 : テスト対象

インストール

公式サイトにある手順を参考にserverspecをインストールします。
Rubyはすでにインストールされているものとします。

gemからserverspecをインストールします。

$ gem install serverspec

初期設定

セッティング

serverspecのセッティングを行います。
任意のディレクトリに移動し、以下のserverspec-initコマンドを実行します。
※Chefのrootディレクトリ(chef-repo)でもよいかもしれません。
対話形式で聞いてくるので、以下のように設定します。

$ mkdir serverspec
$ cd serverspec
$ serverspec-init
Select OS type:

  1) UN*X
  2) Windows

Select number: 1  #UN*Xを選択

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1 #SSHを選択

Vagrant instance y/n: n #nを選択
Input target host name: 192.168.xxx.xxx #テスト対象サーバのIPアドレスを指定
 + spec/
 + spec/192.168.xxx.xxx/
 + spec/192.168.xxx.xxx/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile

SSH認証

SSH接続によりテストを行うため、サーバにパスワードなしで接続できるように、公開鍵認証の設定を行います。
ssh-keygenコマンドで認証用の鍵を作成し、対象サーバへ転送します。

$ ssh-keygen
$ scp ~/.ssh/id_rsa.pub <ユーザ名>@<テスト対象サーバのIPアドレス>:
$ ssh <ユーザ名>@<テスト対象サーバのIPアドレス> # テスト対象サーバへログイン
$ mkdir ~/.ssh
$ mv id_rsa.pub ~/.ssh/authorized_keys

パスワードなしでsudoを実行する設定を行います。

$ sudo visudo
<ユーザ名> ALL=(ALL) NOPASSWD: ALL # ←最終行に追加
$ exit

serverspecは、SSH接続でテスト対象にアクセスしますが、テスト対象にログインするための情報は~/.ssh/configから取得しています。
serverspecが利用できるように、~/.ssh/configを修正します。

$ vi ~/.ssh/config
Host 192.168.xxx.xxx
  HostName 192.168.xxx.xxx #テスト対象サーバのIPアドレスを指定
  User <ユーザ名> #SSH接続でログインするユーザを指定
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile "/root/.ssh/id_rsa" #秘密鍵のパスを指定
  IdentitiesOnly yes
  LogLevel FATAL

テスト

テストコード

serverspec-init後に、テストコードのサンプルとしてspec/192.168.xxx.xxx/httpd_spec.rbが作成されます。httpd_spec.rbを参考に、以下のようにテストコードを書きます。

$ mv spec/192.168.xxx.xxx/httpd_spec.rb spec/192.168.xxx.xxx/apache2_spec.rb
$ vi spec/192.168.xxx.xxx/apache2_spec.rb
require 'spec_helper'

describe package('apache2') do
  it { should be_installed }
end

※require 'spec_helper'でspec/spec_helper.rbが実行され、~/.ssh/configからSSH接続の情報を取得しています。

テスト実行

以下のコマンドを実行し、テストを実行します。
exampleはテストの件数、failuresは失敗したテストの件数を示しています。
以下の場合は、全てのテストが成功したことを示しています。

$ rake spec
/root/.rbenv/versions/2.0.0-p451/bin/ruby -S rspec spec/192.168.xxx.xxx/apache2_spec.rb
.

Finished in 0.10092 seconds
1 example, 0 failures

後は、spec/192.168.xxx.xxx/配下にテスト対象ごとに*_spec.rbファイルを作成し、テストコードを書いていきます。