Ansible と Serverspec を組み合わせて使う

スポンサーリンク

構成管理ツール 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. volanja より:

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

タイトルとURLをコピーしました