読者です 読者をやめる 読者になる 読者になる

Linux環境でServerspecを使ってみる part7

今回はこちらの続きで、apacheを例に設定ファイルのテストをしてみます。
前回:Linux環境でServerspecを使ってみる part6 - ressyのナレッジ的なブログ

テスト内容

以下の内容をテストします。

  1. パッケージがインストールされているか(yum install相当)
  2. サービスhttpdが起動しているか
    • サービスがシステム起動時に立ち上がるようになっているか(chkconfig相当)
    • テスト時点で立ち上がっているか(service httpd相当)
  3. 特定のポート(80/tcp)でリスニングしているか(netstat相当)
  4. httpd.confの設定は正しいか(grep ** httpd.conf相当)
    • ファイルが存在するか
    • Listen80になっているか
    • DocumentRoot/var/www/htmlになっているか

記述例

テストコードを示す前に、リソースタイプマッチャーという用語を簡単に説明しておきます。

  • リソースタイプ:試験対象のリソースの種類(パッケージ、サービス、ファイル、etc...)
  • マッチャー:リソースのあるべき状態(インストールされている、サービスが起動している、etc...)

Serverspecのテストコードは、リソースタイプとマッチャーの組み合わせで記述します。
細かく説明するより、実際のコードを見た方が早いと思うので、記述例を見てみましょう。
シンプルに記述するとこんな感じになります。 

$ cat spec/WEB01/http_spec.rb
require 'spec_helper'

# 1. パッケージがインストールされているか
describe package('httpd') do
  it { should be_installed }
end

# 2. サービスhttpdが起動しているか
describe service('httpd') do
  it { should be_enabled }
  it { should be_running }
end

# 3. 特定のポート(80/tcp)でリスニングしているか
describe port(80) do
  it { should be_listening }
end

# 4. httpd.confの設定は正しいか
describe file('/etc/httpd/conf/httpd.conf') do
  it { should be_file }
  its(:content) { should match(/Listen 80/) }
  its(:content) { should match %r{DocumentRoot "/var/www/html"} }
end

package(**)とかservice(**)がリソースタイプ、it { ** }などで記述しているようなbe_installedなどがマッチャーに相当します。

1.〜3.は、コードを見るだけでなんとなくわかると思うので、説明は割愛します。
どんなことをしているか知りたい方は、ServerspecのHPを参照すると良いでしょう。

Serverspec - Resource Types

4.だけ簡単に解説します。
まず、テスト対象が'/etc/httpd/conf/httpd.conf'となります。
it { should be_file }で、テスト対象がファイルであるかどうかをテストしています。
its(:content) { should match(/Listen 80/) }で、httpd.confのなかにListen 80という設定が記述されているかをテストしています。
its(:content) { should match %r{DocumentRoot "/var/www/html"} }で、httpd.confのなかにDocumentRoot "/var/www/html"という設定が記述されているかをテストします。

ところで、同じshould matchを使用しているのにListenDocumentRootで記述が異なっています。
細かい説明は省略しますが、簡単にいうとテストしたい内容に、正規表現で使う記号が含まれているか/いないかで記述を使い分けます。

今回の例だとDocumentRootには、正規表現ではエスケープ文字として使用する/が使われているので、%r{***}という記述を使用しています。
逆にListenでは正規表現で使うような記号が含まれていないので(/***/)という記述を使用します。

テストを流してみる

記述したテストコードで実際にテストして見ましょう。
実行コマンドは、前回記事の通りです。

$ TARGET_HOST=WEB01 ASK_SUDO_PASSWORD=1 bundle exec rspec spec/WEB01/http_spec.rb
Enter sudo password:

Package "httpd"
  should be installed

Service "httpd"
  should be enabled
  should be running

Port "80"
  should be listening

File "/etc/httpd/conf/httpd.conf"
  should be file
  content
    should match /Listen 80/
  content
    should match /DocumentRoot "\/var\/www\/html"/

Finished in 2.57 seconds (files took 5.88 seconds to load)
7 examples, 0 failures

こんな感じになればOKです。
Failureなどが散見される場合は、WEB01側の設定が間違っていたり、テストコードが間違っている可能性があるので見直しましょう。

最後に

part1で目標にしていたapacheのテストができたので、「Linux環境でServerspecを使ってみる」のシリーズは一旦終了したいと思います。
とはいっても、今後もServerpsecの話題は取り上げるかと思いますが。

参考

この記事は、以下を参考にしています。

Serverspec - Home

「Serverspec」を使ってサーバー環境を自動テストしよう - さくらのナレッジ