概要
Test Kitchenの役割
以下を自動でやってくれます。
- Dockerコンテナ起動
- 起動したDockerコンテナにChefレシピを適用
- その後Serverspec実行
- Dockerコンテナ破棄
環境
OS
| CentOS 6.5 |
このホストでTest KichenやDockerを動かします。
関連ミドルウェア
事前にインストールしておきます。
バージョンは以下のものを使用しました。
| docker-io-1.0.0-6 |
| test-kitchen-1.2.1-1 |
| kitchen-docker-1.5.0-1 |
| serverspec-1.11.0-1 |
テストするレシピ
CentOS6系のサーバーに適用するレシピです。
/root/chef/repo/site-cookbooks/centos6/recipes/httpd.rb
- httpdのインストール
- デーモン起動
- 自動起動設定
これらを行うレシピをDockerとServerspecでテストします。
事前準備(Test Kitchen)
Test Kitchenを動かすホストで
visudoを実行して以下のように変更します。
Defaults requiretty
↓
#Defaults requiretty
セキュリティ上良くないけどレシピ適用テスト専用ホストだからまぁいいかという感じ。
これ以外対処法が分からなかった。
これをやらないと、後に実行することになるkitchen testでエラーが出る。
-----> Starting Kitchen (v1.2.1) >>>>>> ------Exception------- >>>>>> Class: Kitchen::UserError >>>>>> Message: You must first install the Docker CLI tool http://www.docker.io/gettingstarted/ >>>>>> ---------------------- >>>>>> Please see .kitchen/logs/kitchen.log for more details >>>>>> Also try running `kitchen diagnose --all` for configuration
こんなエラー。
.kichen.ymlの作成
テストを行うレシピが入っているクックブックのディレクトリへ移動します。
cd /root/chef/repo/site-cookbooks/centos6/
ディレクトリ移動後、設定ファイルを作成します。
今回はDockerを使用しますのでドライバにkitchen-dockerを指定します。
kitchen init --driver=kitchen-docker
デフォルトで作成される.kichen.yml
---
driver:
name: docker
provisioner:
name: chef_solo
platforms:
- name: ubuntu-12.04
- name: centos-6.4
suites:
- name: default
run_list:
attributes:
これを今回テストする環境に合わせて修正します。
---
driver:
name: docker
provisioner:
name: chef_solo
platforms:
- name: centos-6.4
suites:
- name: default
run_list:
- recipe[centos6::httpd]
attributes:事前準備(Serverspec)
Serverspecのspecファイルを決められたディレクトリに配置します。
こんな感じで置きました。
/root/chef/repo/site-cookbooks/centos6/test/integration/default/serverspec/localhost/httpd_spec.rb
それぞれのディレクトリ名の説明
Chefリポジトリに存在しない場合はmkdirコマンドで作成してください。
/root/chef/repo/site-cookbooks/centos6/
└── test
└── integration
└── default
└── serverspec
└── localhost
├── httpd_spec.rb/root/chef/repo/site-cookbooks/centos6/
これは筆者のChefリポジトリファイルを保存しているディレクトリ名なので適宜読み替えてください。
test/integration/
これはデフォルトでこのディレクトリ名が決まっています。
default/
これは先程作成した.kichen.ymlファイルの
suites: - name: default
ここと合わせてください。
serverspec/
これはテストライブラリ名と合わせてください。
今回はServerspecを使用するのでserverspecとしています。
最後にhttpd_spec.rbです。
specファイル名は何でもいいのですが、ファイル名は必ず_spec.rbで終わるようにする必要があります。
Serverspecのファイルは以下のようなものを準備しておきます。
require 'serverspec' include Serverspec::Helper::Exec include Serverspec::Helper::DetectOS describe package('httpd') do it { should be_installed } end describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end
Test Kitchen実行
準備が完了したらいよいよテストの実行です。
kitchen test
テストを実行するとコンテナが起動してChefの適用、Serverspecが実行されます。
テストが無事通ると以下のような表示になります。
-----> Starting Kitchen (v1.2.1)
-----> Cleaning up any prior instances of <default-centos-65>
-----> Destroying <default-centos-65>...
(略)
Finished destroying <default-centos-65> (0m2.43s).
Finished testing <default-centos-65> (4m39.76s).
-----> Kitchen is finished. (4m39.86s)
これでテスト環境が作成できました!
今後はGitのhookでJenkins経由の実行などを試してみようと思います。