こんにちは。にっしーです。
前回のChefに引き続き、今回もサーバー構築作業の自動化ネタです~。
皆さんは構築したサーバーの構成が設計通りになっているかの確認をどのように行っていますか??
設計書を見ながら手作業で確認していますか?
対象のサーバーが1台ならそれでもよいでしょうが、大規模で複雑な環境の場合どうでしょう?
確認作業のコストは高くなりますし、確認漏れも発生するかもしれません。
なので、Serverspec を使って自動化してみました。
Serverspecってなに??
Serverspec はサーバーの状態をテストするためのフレームワークです。
Serverspec を利用することで、「意図した設定がサーバーに反映されているか」、「意図していない設定がサーバーに反映されていないか」などを確認することができます。
Serverspec はSSH接続を経由したリモート実行と、テスト対象のサーバーにログインして実行するローカル実行の2つの実行方法があり、今回はローカル実行について書きます。
Serverspec のインストールと初期設定
Serverspec はgemパッケージとして配布されています。
# gem install serverspec
上記コマンドでもインストールできますが、Serverspec はいくつかのモジュールに依存しているので、今回は bundler を使って依存関係の解決とバージョン管理をおこなってインストールします。
※ インストールを行うためには、Ruby 及び rubygems がインストールされている必要があります。
Ruby 及び Rubygems のインストール手順については、ここでは割愛します。
・Ruby のインストール
https://www.ruby-lang.org/ja/documentation/installation/
・Rubygems のインストール
https://rubygems.org/
bundler のインストール
まず、bundler をインストールします。
# gem install bundler
インストールが完了したら、Serverspec を実行する作業ディレクトリを作成します(任意の場所でOKです)。
# mkdir /root/serverspec # cd /root/serverspec
Gmfile を以下の内容で作成します。
/root/serverspec/Gemfile source 'https://rubygems.org' gem 'serverspec' gem 'rake'
Serverspec のインストール
bundler を使って Serverspec のインストールを実行します。
# bundle install
インストールできたので初期設定コマンドを実行します。
# bundle exec serverspec-init Select OS type: 1) UN*X 2) Windows Select number: 1 ←テストするOSタイプを入力 Select a backend type: 1) SSH 2) Exec (local) Select number: 2 ←テスト実行方法を入力 + spec/ + spec/localhost/ + spec/localhost/sample_spec.rb + spec/spec_helper.rb + Rakefile + .rspec
テストコードの作成
Serverspec 実行時に読み込まれるテストコードは Rakefile で定義します。
serverspec-init コマンドを実行に作成される標準の Rakefile では、spec ディレクトリ以下の各ディレクトリにある、xxx_spec.rb が読み込まれ実行されます。テストコードの追加は、xxx_spec.rb の命名規則で、「spec/テスト対象のサーバー名/」配下に作成します。
今回は、以前に私が書いた Chef の記事で紹介した apache インストールレシピ で、正しく apache がインストールされたかを Serverspec で確認してみます。
以下のサンプルでは、テスト対象のサーバー名を localhost としています。Serverspec を実行するサーバーに合わせて読み換えてください。
/root/serverspec/spec/localhost/apache_spec.rb require 'spec_helper' # apacheがインストールされているかチェック describe package('httpd') do it { should be_installed } end # apacheが起動しているかチェック describe service('httpd') do it { should be_running } end # 80番ポートが待ち受け状態になっているかチェック describe port(80) do it { should be_listening } end
テストの実行
テストコードを作成したら rake コマンドでテストを実行します。
serverspec-init コマンドを実行すると、サンプルのテストコード( spec/localhost/sample_spec.rb )が作成されています。
# bundle exec rake spec /usr/bin/ruby -I/usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/lib:/usr/lib/ruby/gems/1.8/gems/rspec-support-3.2.2/lib /usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/exe/rspec --pattern spec/localhost/*_spec.rb Package "httpd" should be installed Service "httpd" should be running Port "80" should be listening Finished in 0.09154 seconds (files took 0.2167 seconds to load) 3 examples, 0 failures
Serverspec を実行するサーバーの環境によっては、このサンプルコードが失敗します。失敗する場合は、削除するか、別のディレクトリに移動してください。
実行結果が、0 failures となっていればOKです!
下記は 81 番ポートで apache を起動して、テストを実行した結果です。
結果が、1 failures となり、エラーになった箇所の情報が表示されます。
# bundle exec rake spec /usr/bin/ruby -I/usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/lib:/usr/lib/ruby/gems/1.8/gems/rspec-support-3.2.2/lib /usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/exe/rspec --pattern spec/localhost/*_spec.rb Package "httpd" should be installed Service "httpd" should be running Port "80" should be listening (FAILED - 1) Failures: 1) Port "80" should be listening On host `localhost' Failure/Error: it { should be_listening } expected Port "80" to be listening /bin/sh -c netstat -tunl | grep -- :80\ # ./spec/localhost/apache_spec.rb:15 Finished in 0.07396 seconds (files took 0.19472 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/localhost/apache_spec.rb:15 # Port "80" should be listening /usr/bin/ruby -I/usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/lib:/usr/lib/ruby/gems/1.8/gems/rspec-support-3.2.2/lib /usr/lib/ruby/gems/1.8/gems/rspec-core-3.2.3/exe/rspec --pattern spec/localhost/*_spec.rb failed
簡単ではありますが、このような感じで Serverspec を使って、サーバー構成を自動でテストすることができます。
今回は Serverspec 導入までということで、サービスの起動と使用ポートの確認程度の簡単なテストコードですが、もっと細かな確認も Serverspec で自動化することができます。
機会があれば応用編の記事を書く・・・かも!?
Chef と組み合わせで使うと便利なので是非使って見てくださいー!