Serverspec
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にあげました。
参考
とても良い・・・