Chefでプログラマブルなサーバ構築ができるようになったため、構築後のサーバの状態をプログラマブルにテストするために、serverspecをインストールしてみました。
インストール
公式サイトにある手順を参考に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ファイルを作成し、テストコードを書いていきます。