ようへいの日々精進XP

よかろうもん

今更頑張る berkshelf

何を今更と言われるかもしれなけど

berkshelfググると...

  • cookbook の依存関係を管理するツール
  • rubygem を管理する bundler みたいなもの

というような紹介を見かけるけど、自分は恥ずかしながら今まで全く使ったことが無くて berkshelf に辿り着いたのは test-kitchen で複数の cookbook に依存するような cookbook をテストをする場合にどうするんだろうという疑問から...。入り口は何であれ berkshelf を色々と弄ってみることにする。


事例

  • CentOSremi パッケージに登録されている redis パッケージを導入する
  • remi パッケージの登録は opscode が提供している cookbook である yum を利用する

上記の場合に必要となる cookbook は以下の通りかなと...

  • redis をインストールする cookbook
  • opscode が提供する cookbookyum

一つにすることも出来るかもしれないけど、二つの cookbook が必要という前提で進める。


準備

Berkshelf のインストール

Berkshelf をインストールする。

gem install berkshelf --no-ri --no-rdoc -V

berks コマンドで cookbook のひな形を作成

berks cookbook を使って redis をインストールする cookbook を作成する。

cd chef-repo/site-cookbooks/
berks cookbook redis_cookbook

recipe は適当に...

とりあえず以下のような recipe を書いた。

include_recipe 'yum::remi'

package 'redis' do
  action :install
end

include_recipe 'yum::remi' がポイント。

Berkfile の用意

bundler で言うところの GemfileBerkfile を以下のように用意する。

cd chef-repo/site-cookbook/redis_cookbook
vim Berkfile

Berkfile の中身は下記の通り。

site :opscode

metadata
cookbook 'yum', git: 'https://github.com/opscode-cookbooks/yum.git'

上記のように依存関係のある cookbook を指定する。

.kitchen.yml を用意

test-kitchen を使うので .kitchen.yml を以下のように用意する。

vim chef-repo/site-cookbook/.kitchen.yml

内容は以下の通り。

---
driver_plugin: docker
driver_config:
  require_chef_omnibus: true

platforms:
- name: centos-6
  driver_config:
    image: centos

suites:
- name: default
  run_list:
    - recipe[yum::remi]
    - recipe[redis_cookbook]
  attributes: {}

テストには毎度お馴染みの kitchen-docker を使う。


レッツテスト

準備が整ったところでテストを実行する。

kitchen test

しばらく放置する。

       Finished converging <default-centos-6> (2m19.66s).
-----> Setting up <default-centos-6>...
       Finished setting up <default-centos-6> (0m0.00s).
-----> Verifying <default-centos-6>...
       Finished verifying <default-centos-6> (0m0.00s).
-----> Destroying <default-centos-6>...
       978d1002b4e7919b8746c9474e5b4249e6a082c0184b8c4c55544531e937b702
       978d1002b4e7919b8746c9474e5b4249e6a082c0184b8c4c55544531e937b702
       Finished destroying <default-centos-6> (0m1.83s).
       Finished testing <default-centos-6> (2m22.43s).
-----> Kitchen is finished. (2m25.09s)

無事にテスト終了。


最後に

  • とりあえず Berkshelf を使ってみた感じで悔しい
  • include で他のレシピを利用するというのは正直初めてで感動した