Serverspec で複数のホストで共通のテストを使い回す

Serverspec でホストが異なってもテストを共通して使いまわせるように、spec/ ディレクトリ構成と Rakefile, spec_helper の設定を修正しました。方法は、以下の公式ドキュメントのページに書いてあります。

Serverspec – Advanced Tips の “How to share Serverspec tests among hosts”

スポンサーリンク

デフォルトの serverspec-init コマンドはホストごとにテストを書く構成になる

デフォルトでは、serverspec-init コマンドは spec ディレクトリ以下に、ホスト名(またはIPアドレス)ごとにディレクトリを持つ構成となります。

公式ドキュメントに以下の説明があるのですが…

|– Rakefile
-- spec
|-- spec_helper.rb
— www.example.jp
`– httpd_spec.rb

This directory structure forces you to write tests per host.

「このディレクトリ構成の場合、ホストごとにテストを書かなきゃいけない」と説明があります。異なるホストごとに、同じ内容のテストを書くのは避けたいので、使いまわせるように以降の設定を行います。

テストを使いまわすための spec/ ディレクトリ構成

ということで、共通するテストを異なるホストでも共有して使いまわせるようにする設定を行う。ドキュメント通りに進めれば簡単です。まずは、spec/ ディレクトリの構成を変更します。以下のような spec/ ディレクトリ構成にします。

公式ドキュメント通りの構成なのですが、app, base, db, proxy はそれぞれホストの role(役割)で分ける。

Rakefile の修正

続いて、Rakefile の修正です。以下の内容に置き換えました。冒頭の hosts 配列に、name(ホスト名), roles(役割)を指定したホストを追加します。

Rakefile

公式ドキュメントにあるコードがとても分かりやすいので参考にして、全ての role(app, base, db, proxy)をサーバー1台でまかなう場合の構成です。vagrant.test が vagrant 上のテスト用VM、example.com が本番用サーバーとなります。

複数のホストで role を分割する場合は、ドキュメント通り name, roles のペアを設定したホストを、冒頭の hosts 配列に追加します。

この Rakefile により、以下の Serverspec でのテスト実行用の Rake タスク(rake コマンド)が作成される。

rake serverspec:example
rake serverspec:vagrant
rake spec(serverspec:all)

実際に rake タスクを確認すると以下の通り。

serverspec テストを実行するには、これらの rake コマンドを使います。

spec_helper.rb の修正

続いて、spec_helper.rb を修正。ドキュメントを参考にして以下のように変更しました。

spec/spec_helper.rb

このコードも分かりやすいかと思います。デフォルトで sudo 実行のパスワード入力を求めるように設定。また後半では、ENV[‘TARGET_HOST’] でテスト対象のホストを取得して、Net::SSH.start で SSH ログインしています。

~/.ssh/config の設定

最後に、~/.ssh/config の設定。

vagrant 用の SSH 接続設定は、以下のコマンドで吐き出せます。

あと Severspec でテストを実行するユーザー、今回の本番サーバーの場合では… example.com 用の User である example_user は、以下のいずれかの条件を満たす必要があります。

1. パスワードなしで sudo 実行できるユーザー
2. パスワードありで sudo 実行できるユーザー。この場合は serverspec テスト実行時に、パスワードを入力します。

私は、パスワードなしの sudo 実行ユーザーはちょっと怖い気がするので、前述したとおり2のほうの設定を spec_helper に書きました。以上です。

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!