cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平(@inokara)です。
はじめに
Chef の Cookbook のテストに test-kitchen と kitchen-ec2 そして Serverspec を使う環境を整えて簡単な Cookbook をテストしてみたいと思いますので宜しくお願い致します。
参考
今日はこれでキマリ
以下、モコズキッチン風に進めますのでご容赦下さい。
メールが来ています
よへみちさん、こんにちわ。いつも朝の身支度をしながら見ています。InfluxDB をインストールする Cookbook を作ったので、是非、テストしてみて下さい。(かっぱ 38 歳)
おお、そうですが InfluxDB ですかー、なかなか尖ってますね。ということで、今日はガッツリ系で行きましょう!
ガッツリ InfluxDB をインストールする Cookbook
ということで、以下はこの Cookbook を使って進める。
test-kitchen の準備
環境
- MacOS X 10.9 Marvericks
Cookbook を clone してくる
cd ${chef-report}/site-cookbook
git clone https://github.com/inokappa/influxdb-chef.git
test-kitchen のインストール
sudo gem install test-kitchen --no-ri --no-rdoc -V
kitchen-ec2 の導入
cd ${chef-report}/site-cookbook/site-cookbook/influxdb-chef
kitchen init --driver=kitchen-ec2
以下のように kitchen-ec2 がインストールされる。
kitchen-ec2 の準備
README.md に従って設定を進める。設定あたっては以下の項目を事前に準備しておく。
- AWS ACCESS KEY
- AWS SECRET ACCESS KEY
- SSH KEY ID
- SSH KEY File
- Region
- AZ
- Security Group ID
- AMI ID
結構多いね…と思いながら準備して以下のように .kitchen.yml を作成する。
---
driver:
name: ec2
aws_access_key_id: AKxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_ssh_key_id: chef-test
ssh_key: <%= File.expand_path('~/.ssh/chef-test.pem') %>
security_group_ids: ["sg-0xxxxxx”]
region: us-east-1
availability_zone: us-east-1b
require_chef_omnibus: true
platforms:
- name: centos-6.5
driver:
image_id: ami-eb6b0182
username: root
suites:
- name: default
run_list:
- recipe[influxdb::default]
attributes:
とりあえずこれで test-kitchen は動くようになったはず。
よへずきっちん
kitchen create
kitchen create でテスト用の EC2 インスタンスを作成する。
kitchen create
以下のように表示される。
これで準備完了。インスタンスがあがる時間分待つ。料理には待ち時間も必要…。
尚、特に指定をしなければ m1.small タイプのインスタンスが起動するので注意する。インスタンスタイプを指定したい場合には以下のように :flavor_id を指定すれば良さそう。
flavor_id: t1.micro
kitchen converge
kitchen converge で Cookbook を適用してみる。
kitchen converge
おお、いけた、いけた。
kitchen list
kitchen list でテストインスタンスを確認する。
kitchen list
以下のように表示される。
kitchen login
kitchen login を使ってインスタンスにログインすることが出来る。
kitchen login
以下のようにログインして…httpd と influxdb がインストールされているか確認する。
但し、ログインして確認していいのは 2013 年までなので注意しよう。
kitchen destroy
テストに使ったインスタンスは kitchen destroy してまう。
kitchen destroy
以下のように表示されインスタンスはターミネートされる。
Serverspec によるテストどんぶり(ドリブン)
せっかく Chef で cookbook を適用しても、その結果をサーバーにログインして確認していてもいいのは 2013 年までで 2014 年からは漏れ無く Serverspec を使いたい。
Serverspec を使う準備
こちらの記事を参考にして(わざとらしく宣伝w)test-kichen の処理の後に Serverspec でテストさせる為の設定を行う。test ディレクトリを作成して以下に integration/default/serverspec というディレクトリを作成する。
cd ${chef-repo}/site-cookbooks/influxdb-chef
mkdir -p test/integration/default/serverspec
serverspec ディレクトリ以下に influexdb_spec.rb という Spec ファイルを作成する。
require 'serverspec'
include Serverspec::Helper::Exec
include Serverspec::Helper::DetectOS
RSpec.configure do |c|
c.before :all do
c.path = '/sbin:/usr/sbin'
end
end
%w(httpd influxdb).each do |sv|
describe package("#{sv}") do
it { should be_installed }
end
describe service("#{sv}") do
it { should be_enabled }
it { should be_running }
end
end
上記では…
- httpd と influxdb がインストールされていること
- httpd と influxdb がサーバー再起動時にサービス自動起動が有効になっていること
がテストされる。
kitchen verify
kitchen verify を実行して test ディレクトリ以下のテストツールがアップロードされて busser 経由でのテストが実行される。(via test-kitchenのつかいかた)
kitchen verify
以下のように出力された。
うわあ、たくさん Failure だー。
テスト結果を受けてレシピを修正。
どうやら httpd と influxdb の起動と再起動時のサービス起動が有効になっていないようだ。ということでレシピを以下のように修正した。
--- default.rb.old 2014-06-07 23:52:27.000000000 +0900
+++ default.rb 2014-06-07 23:53:02.000000000 +0900
@@ -12,8 +12,14 @@
not_if { ::File.exists?("/usr/bin/influxdb") }
end
-%w(httpd vim).each do |sv|
+%w(httpd vim redhat-lsb-core).each do |sv|
package "#{sv}" do
action :install
end
end
+
+%w(httpd influxdb).each do |sv|
+ service "#{sv}" do
+ action [ :start, :enable ]
+ end
+end
まず influxdb を自動起動させる為に redhat-lsb-core パッケージを追加でインストールする必要がある。また、合わせて httpd と influxdb を起動させる為の service リソースも追加。ということで、改めて…
kitchen converge からの kitchen verify
まずは kitchen converge で修正したレシピで収束させる。
kitchen converge
以下のように…
おお、オールブルー。次に kitchen verify してテスト。
kitchen verify
以下のように…
おお、オールグリーン。
まとめ
今回やったこと
- MacOS X 10.9 Marverics に test-kitchen と kitchen-ec2 を導入した
- 簡単な cookbook を作って test-kitchen を介して EC2 インスタンスで実行した
- 実行後 Serverspec を使って cookbook の設定が反映されているかをテストした
- また、テストの結果を受けて cookbook を修正してテストが正常に終了するように収束させた
初めての kitchen-ec2
- kitchen-docker ばかり使っていたけど kitchen-ec2 も気軽に利用できた
- EC2 インスタンスなので起動するまでの時間や課金については注意を払う必要がある
- Docker コンテナを使う kitchen-docker よりも実際のサーバーに近い(サーバーそのもの)でテストが出来るのは嬉しい
元記事は、こちら