構成管理ツール Ansible とテストフレームワーク Serverspec を組み合わせて使いたい。具体的には、Ansible で構築したホストに対して、Ansible のインベントリファイルに従って、適切なロールのテストを Serverspec で実行したい。
何か良い解がないかと探していたところ、ansible_spec というのを見つけたので、これを使わせていただくことにする。
今回は題材として、以前作った ansible-powerdns を使う。
ansible_spec のインストール
まずは ansible_spec をインストールする。今回は bundler を使って、アプリケーションのディレクトリ内にインストールする。
Gemfile
:
source 'https://rubygems.org'
gem 'rake'
gem 'serverspec'
gem 'ansible_spec'
bundler を実行する。
$ bundle install --path vendor/bundle
これで関連モジュール一式がインストールされる。
初期設定
ansible_spec の ansiblespec-init
コマンドを用いて、初期ファイルを生成する。
$ bundle exec ansiblespec-init
これにより、以下のファイルが生成される。
.ansiblespec
spec/spec_helper.rb
Rakefile
ただしこの spec/spec_helper.rb
は、バージョンが古いせいかわからないがうまく動かないようなので、最新の Serverspec で生成されるファイルに差し替える。ファイルは Gist に置いておいた。
$ curl -O spec/spec_helper.rb https://gist.githubusercontent.com/akagisho/676d9c602fcad7fd7add/raw/3b8fb0083a5231410cbea7285dfd497122135b5b/spec_helper.rb
次に、Ansible のプレイブック (site.yml
) に name:
属性がない場合は、それぞれのグループに対してこれを追加しておく (例)。これがないと ansible_spec がエラーになるためだ。
また、Serverspec の実行結果はデフォルトでは色が付かないが、カラーで表示したい場合は ~/.rspec
ファイルに次の1行を書いておく。
--color --format d
テストの作成
初期設定が済んだら、いよいよ実際にテストを書いていく。テストコードは、roles/<role 名>/spec
というディレクトリを掘り、その中に hoge_spec.rb
のような名前で作成する。テストコードの冒頭では require 'spec_helper'
として spec_helper
をロードしておくこと。
例として、Ubuntu に nginx がインストールされていることをテストするには、次のように書く。
describe package('nginx') do
it { should be_installed }
end
また、nginx がサービスとして自動起動するようになっていること、現在起動していることをテストするには、次のように書く。
describe service('nginx') do
it { should be_enabled }
it { should be_running }
end
Port 80 を listen していることをテストするには、次のように書く。
describe port(80) do
it { should be_listening }
end
この他のテストコードの書き方は、公式ドキュメントに書かれてある。
作成したテストは、次のコマンドで確認できる。
$ bundle exec rake -T
テストの実行
作成したテストは、次のようにして実行する。
$ bundle exec rake serverspec:<group 名>
このとき、Ansible のインベントリファイルが hosts
という名前で存在している必要がある。筆者の作った ansible-powerdns では、インベントリファイルを <environment>/inventory
という名前にしているので、事前にシンボリックリンクを貼っておく。例えば production
環境に対してテストを実行したい場合は、次のようにする。
$ rm -f hosts && ln -s production/inventory hosts
$ bundle exec rake serverspec:master
$ bundle exec rake serverspec:slave
実行結果は長くなるので省略する。テストが通ったかどうかを機械的に判定するには、終了ステータス $?
が 0 かどうかを確認すると良い。
まとめ
以上により、Ansible で構築したホストに対して、Serverspec でテストを実施できるようになった。今後は次のような点を改善したいと考えている。
- Ansible の変数に沿ったテストができるように
- 実行対象の環境を引数か環境変数で指定できるように
コメント
はじめまして。ご利用いただきありがとうございます。
最新版(v0.2.1)では次の点を修正していますので、宜しければお試しください。
https://github.com/volanja/ansible_spec
・spec/spec_helper.rbの修正(Serverspec v2へ対応しました)
・Ansible のプレイブック (site.yml) に name: 属性がない場合は明示的にfailするようにしました。
・実行対象の環境を環境変数で指定できるようにしました。
https://github.com/volanja/ansible_spec#option-environment-variable