備忘録のため,内容の正当性については責任を持ちません。

構成管理ツール 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 の変数に沿ったテストができるように
  • 実行対象の環境を引数か環境変数で指定できるように

参考ページ

コメント

コメント(1) “Ansible と Serverspec を組み合わせて使う”

  1. はじめまして。ご利用いただきありがとうございます。
    最新版(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

コメントする




CAPTCHA