test-kitchenかぁ...
test-kitchen、
最近見ないうちに、色々と機能が追加されていた。
version 1.0.0が正式にリリースされた。
せっかくなので使ってみた。
test-kitchenとは
cookbookって世にあるじゃないですか。chefというツールで使う
ミドルウェアインストールのためのレシピ。
で、そのレシピがきちんと動作するのか────インストールできるのか?
そしてインストールした後きちんと動作するのか?というのを確認するため、
opscodeが作ってるツールです。
必須なソフトウェア
既存のchef cookbookを対応させていく
今回はたまたま対応準備を進めていた、
aiming-cookbooks以下にあるchef-td-agent cookbook(TD様のリポジトリからforkしました)を使う。
test-kitchenの環境整備
Gemfileを用意する
Gemfileを用意して、test-kitchen、Berkshelf、それとserverspecをインストールする。
source 'https://rubygems.org/'
gem 'test-kitchen'
gem 'berkshelf'
gem 'serverspec'
必要なパッケージをインストール
おなじみのコマンド。
bundle ex ins --path vendor/bundle
kitchen init を実行する
bundle ex kitchen init
以上のコマンドを実行すると、Gemfileにkitchen-vagrant
パッケージが追記されるので、
改めてbundle ex install
を行う。
kitchen-vagrant をインストール
bundle ex ins
Gemfileを整える
:development
グループ に各gemパッケージをまとめたいので
以下のようにGemfileを整える。
source 'https://rubygems.org/'
group :development do
gem 'test-kitchen'
gem 'berkshelf'
gem 'kitchen-vagrant'
gem 'serverspec'
end
Berksfileの準備
chef-td-agent
パッケージは、yum
や apt
などのcookbookを必要とする。
opscodeから落とさないといけない。
chef-td-agent
パッケージの metadata.rb に必要となるcookbook一覧が書いてある。
このmetadata.rbに書かれているパッケージを利用するため、
Berkshelfを利用する。
Berksfileを使えば、まるでgem installのごとくcookbookがインストールできる。
今回は以下のような形で、Berksfileを書く。
site :opscode
metadata
これだけ。
.kitchen.ymlの編集
今回テストしたいレシピはtd-agent::default
。で
アーキテクチャはUbuntu
と CentOS
なのでデフォルトの.kitchen.yml
をちょっとだけ変更しておく。
---
driver:
name: vagrant
provisioner:
name: chef_solo
platforms:
- name: ubuntu-12.04
- name: centos-6.4
suites:
- name: default
run_list:
- td-agent::default
attributes:
まずはtest-kitchenを使ってテスト
以下のコマンドを使えばテストできる
bundle ex kitchen test
これでcookbookのインストールは終わり。
無事cookbookが実行されればそれでおしまい!
だけどこれだけだとすげー不安
... インストールされたcookbook、そういえばserviceとしてtd-agent
が登録され、
起動されるようになってる。
けど、本当に...?
という不安を解消するため、serverspec を合わせて利用する。
serverspec
test-kitchen、便利すぎる。serverspecに対応している(!)。
以下の形でspec fileを用意する。
カレントディレクトリはcookbookのルートである、とする。
mkdir -p test/integration/default/serverspec
cd test/integration/default/serverspec
touch td-agent_spec.rb
td-agent_spec.rbの内容
test-kitchenのドキュメント、サーバーテストの例にならって、td-agentがサービスとして動いているのか?
というテストだけ書いてみる。
# -*- coding:utf-8 -*-
require 'serverspec'
require 'pathname'
include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS
RSpec.configure do |c|
c.before :all do
c.os = backend(Serverspec::Commands::Base).check_os
c.path = '/sbin:/usr/bin'
end
end
describe "td-agent daemon" do
it "has a running service of td-agent" do
expect(service("td-agent")).to be_running
end
end
これだけだとまずい
sudoでserverspecが動くようにしなければいけない。
busserというgemを利用してserverspecを動かしている。
そのままだと/var/run/td-agent/td-agent.pid
にアクセスすることができない。
td-agentユーザー以外はアクセス出来ないような設定になっているからだ。
td-agentがサービスとして動作しているか確認するためには、
sudoの状態でserverspecを実行する必要がある。
.kitchen.yml
に以下の形でsudoが有効になるようにする。
(デフォルトだと無効になってる...)
2013/12/5追記
busserのsudoフラグについて、trueに戻す変更コミットが行われた。
---
driver:
name: vagrant
provisioner:
name: chef_solo
platforms:
- name: ubuntu-12.04
- name: centos-6.4
suites:
- name: default
run_list:
- td-agent::default
attributes:
busser:
sudo: true
改めて、bundle ex kitchen test
を実行する。
すると、serverspecが走ってテストされることが確認できる。
今後どうするのか
test-kitchenでchef cookbookのテスト、及びcookbookにより
構築されたサーバーの状態がテストできるようになった。
今後はCIに乗せてテストをしていきたい。
世の中、どんどん未来になっていっている。