share facebook facebook2 twitter menu hatena pocket slack

2014.06.14 SAT

Chef の Cookbook を test-kitchen + kitchen-ec2 + Serverspec を使ってテストする

川原 洋平

WRITTEN BY川原 洋平

cloudpack自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。


はじめに

ChefCookbook のテストに test-kitchenkitchen-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 がインストールされる。

chef-cookbook-test-kitchen-kitchen-ec2-serverspec_01


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

以下のように表示される。

2014060702.png

これで準備完了。インスタンスがあがる時間分待つ。料理には待ち時間も必要…。

尚、特に指定をしなければ m1.small タイプのインスタンスが起動するので注意する。インスタンスタイプを指定したい場合には以下のように :flavor_id を指定すれば良さそう。

flavor_id: t1.micro


kitchen converge

kitchen convergeCookbook を適用してみる。

kitchen converge

おお、いけた、いけた。

2014060703.png


kitchen list

kitchen list でテストインスタンスを確認する。

kitchen list

以下のように表示される。

2014060705.png


kitchen login

kitchen login を使ってインスタンスにログインすることが出来る。

kitchen login

以下のようにログインして…httpdinfluxdb がインストールされているか確認する。

2014060706.png

但し、ログインして確認していいのは 2013 年までなので注意しよう。


kitchen destroy

テストに使ったインスタンスは kitchen destroy してまう。

kitchen destroy

以下のように表示されインスタンスはターミネートされる。

2014060704.png



Serverspec によるテストどんぶり(ドリブン)

せっかく Chefcookbook を適用しても、その結果をサーバーにログインして確認していてもいいのは 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

上記では…

  • httpdinfluxdb がインストールされていること
  • httpdinfluxdb がサーバー再起動時にサービス自動起動が有効になっていること

がテストされる。


kitchen verify

kitchen verify を実行して test ディレクトリ以下のテストツールがアップロードされて busser 経由でのテストが実行される。(via test-kitchenのつかいかた

kitchen verify

以下のように出力された。

2014060708.png

うわあ、たくさん Failure だー。


テスト結果を受けてレシピを修正。

どうやら httpdinfluxdb の起動と再起動時のサービス起動が有効になっていないようだ。ということでレシピを以下のように修正した。

--- 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 パッケージを追加でインストールする必要がある。また、合わせて httpdinfluxdb を起動させる為の service リソースも追加。ということで、改めて…


kitchen converge からの kitchen verify

まずは kitchen converge で修正したレシピで収束させる。

kitchen converge

以下のように…

2014060709.png

おお、オールブルー。次に kitchen verify してテスト。

kitchen verify

以下のように…

2014060710.png

おお、オールグリーン。



まとめ


今回やったこと

  • MacOS X 10.9 Marvericstest-kitchenkitchen-ec2 を導入した
  • 簡単な cookbook を作って test-kitchen を介して EC2 インスタンスで実行した
  • 実行後 Serverspec を使って cookbook の設定が反映されているかをテストした
  • また、テストの結果を受けて cookbook を修正してテストが正常に終了するように収束させた


初めての kitchen-ec2

  • kitchen-docker ばかり使っていたけど kitchen-ec2 も気軽に利用できた
  • EC2 インスタンスなので起動するまでの時間や課金については注意を払う必要がある
  • Docker コンテナを使う kitchen-docker よりも実際のサーバーに近い(サーバーそのもの)でテストが出来るのは嬉しい

元記事は、こちら