Linux環境でServerspecを使ってみる part7
今回はこちらの続きで、apacheを例に設定ファイルのテストをしてみます。
前回:Linux環境でServerspecを使ってみる part6 - ressyのナレッジ的なブログ
テスト内容
以下の内容をテストします。
- パッケージがインストールされているか(
yum install
相当) - サービス
httpd
が起動しているか- サービスがシステム起動時に立ち上がるようになっているか(
chkconfig
相当) - テスト時点で立ち上がっているか(
service httpd
相当)
- サービスがシステム起動時に立ち上がるようになっているか(
- 特定のポート(80/tcp)でリスニングしているか(
netstat
相当) httpd.conf
の設定は正しいか(grep ** httpd.conf
相当)- ファイルが存在するか
Listen
は80
になっているか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を参照すると良いでしょう。
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
を使用しているのにListen
とDocumentRoot
で記述が異なっています。
細かい説明は省略しますが、簡単にいうとテストしたい内容に、正規表現で使う記号が含まれているか/いないかで記述を使い分けます。
今回の例だと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」を使ってサーバー環境を自動テストしよう - さくらのナレッジ