猿に文明を与えるな

個人的な勝手なまとめ。

Berkshelf, Kitchenを利用したCookbookの作成

設定ファイルに不要な記述をしがちなので最低限の必要作業をまとめ。

新規にCookbookを作成する想定で記述。

Berkshelf、Kitchenをインストール

Chef Development KitをChefのサイトからインストールすると、 Berkshelf、Kithenも含まれている

Cookbookを作成

$ berks cookbook sample_cookbook

=> Berkfile、.kitchen.ymlを含むCookbookが作成される

サンプルレシピを作成

--- a/recipes/default.rb
+++ b/recipes/default.rb
@@ -6,3 +6,10 @@
 #
 # All rights reserved - Do Not Redistribute
 #
+
+case node[:platform]
+when 'debian', 'ubuntu'
+  include_recipe 'apt'
+end
+
+include_recipe 'nginx'
--- a/metadata.rb
+++ b/metadata.rb
@@ -5,3 +5,5 @@ license          'All rights reserved'
 description      'Installs/Configures sample_cookbook'
 long_description 'Installs/Configures sample_cookbook'
 version          '0.1.0'
+
+depends 'nginx'

Kitchenをセットアップ

kitchen initを実行すると .kitchen.yml のrun_listが更新される。 (これくらい手で書けばよい話だけど)

--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -12,4 +12,5 @@ platforms:
 suites:
   - name: default
     run_list:
+      - recipe[sample_cookbook::default]
     attributes:
  • testを実行
$ kitchen setup

.kitchen.ymlに書かれた各platformのVMが作成され、レシピが適用される。

テストを実行

テストを実行する場合、kitchen verify を実行する

$ kitchen verify
-----> Starting Kitchen (v1.4.0)
-----> Verifying <default-ubuntu-1204>...
       Preparing files for transfer
       Transferring files to <default-ubuntu-1204>
       Finished verifying <default-ubuntu-1204> (0m0.00s).
-----> Verifying <default-centos-64>...
       Preparing files for transfer
       Transferring files to <default-centos-64>
       Finished verifying <default-centos-64> (0m0.00s).
-----> Kitchen is finished. (0m3.41s)

テスト未作成なので上記のとおり。 さきほどインストールしたnginxに対するテストを作ってみる。

# test/integration/default/serverspec/service_spec.rb 

require 'serverspec'

# Required by serverspec
set :backend, :exec

describe service('nginx') do
  it { should be_enabled }
  it { should be_running }
end

再度テストを実行する。 下記の出力となり、.kitchen.yml内の各platformに対しテストが実行された。

$ kitchen verify
-----> Starting Kitchen (v1.4.0)
-----> Verifying <default-ubuntu-1204>...
       Preparing files for transfer
-----> Busser installation detected (busser)
       Installing Busser plugins: busser-serverspec
       Plugin serverspec already installed
       Removing /tmp/verifier/suites/serverspec
       Transferring files to <default-ubuntu-1204>
-----> Running serverspec test suite
       /opt/chef/embedded/bin/ruby -I/tmp/verifier/suites/serverspec -I/tmp/verifier/gems/gems/rspec-support-3.3.0/lib:/tmp/verifier/gems/gems/rspec-core-3.3.0/lib /opt/chef/embedded/bin/rspec --pattern /tmp/verifier/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/verifier/suites/serverspec
       
       Service "nginx"
         should be enabled
         should be running
       
       Finished in 0.72385 seconds (files took 0.55695 seconds to load)
       2 examples, 0 failures
       
       Finished verifying <default-ubuntu-1204> (0m7.95s).
-----> Verifying <default-centos-64>...
       Preparing files for transfer
-----> Busser installation detected (busser)
       Installing Busser plugins: busser-serverspec
       Plugin serverspec already installed
       Removing /tmp/verifier/suites/serverspec
       Transferring files to <default-centos-64>
-----> Running serverspec test suite
       /opt/chef/embedded/bin/ruby -I/tmp/verifier/suites/serverspec -I/tmp/verifier/gems/gems/rspec-support-3.3.0/lib:/tmp/verifier/gems/gems/rspec-core-3.3.0/lib /opt/chef/embedded/bin/rspec --pattern /tmp/verifier/suites/serverspec/\*\*/\*_spec.rb --color --format documentation --default-path /tmp/verifier/suites/serverspec
       
       Service "nginx"
         should be enabled
         should be running
       
       Finished in 0.49234 seconds (files took 0.57095 seconds to load)
       2 examples, 0 failures
       
       Finished verifying <default-centos-64> (0m16.04s).
-----> Kitchen is finished. (0m26.48s)

おまけ

VM作成→テスト実行まで一気に行いたい場合は次のいずれかを実行する。 実行後にVMを破棄するか否かでオプションを変えるので、手元でレシピを変更する / CIでCookbookをテストするなど用途に応じて変えるとよい。

$ kitchen test  # 実行後にVMを破棄
$ kitchen test --destroy=never # 実行後にVMを破棄しない