scramble cadenza

技術ネタのガラクタ置き場

vagrant-berkshelf を使わずに Berkshelf + knife-solo で環境作ってみた話

イントロ

タイトルの通り。今までは面倒臭がって全部レシピを書いていたけれど、Berkshelf 使えば、その手間すら省けると聞いたので使ってみました。

ところで Berkshelf は何も考えないと vagrant-berkshelf という Vagrantプラグインを経由して berkshelf 使おうとします。

何も考えず使ってうまくいけば問題ないのですけれど、問題が起きた場合、何が原因かを判断するのが若干面倒かなぁと個人的には思ってました。
エラーが出たらプラグインが悪いかもしれないし、gem が悪いかもしれないし、もしかしたら相性が悪いのかもしれない。
どうせ chef + berkshelf 使うのなら、chef と vagrant を切り離して考えて、Berkshelf は chef をより良く快適に使うためのもの、という役割が分担されてたほうが、問題の切り分けがやりやすいかなぁと思ってます。

そんなわけで Vagrant の berkshelf プラグインはあまり好きではなくて、それを使わずやってみましたよというお話。

自分の中でもまとめきれてない部分があり、ツッコミどころ満載ですが、自分なりの結論を書いてみることにします。

Berkshelf

Berkshelf とはなんぞや?という話は省略。 自分が感じた Berkshelf のメリットとデメリット。

メリット

1. cookbook を使いまわせる

Berkshelf は bundler と似たようなものだ、と言われますが、まさにその通り(公式にも書いてあるし)。このおかげで 自分でわざわざレシピを書かずに済む というのが利点の一つ。
github 以外の repository を指定できるのも Good。

2. 依存関係の解消

metadata.rb で解決できるらしいです。これも Gemfile と似たような感じで Berksfile に必要最低限の cookbook を書いておけば、細かい依存関係は考えなくていい 、というのが利点。
頼もしい。

デメリット

1. Berkshelf に頼り過ぎると、cookbook を運用できなくなる可能性

もちろん Berkshelf だけに言えることじゃないけれど。

berkshelf に頼ってレシピを読んでなくて、いざエラーが出てしまった時に、何のレシピのどこが問題なのか、を把握するのが難しいのは言うまでもありません。
Berkshelf 使うとあっという間に依存関係の見知らぬ cookbook が入ってきます。いつの間にこんな cookbook が入っているの? という状態で、尚且つそのレシピの中にバグがあった場合どうなるでしょう? 簡単に気づけるでしょうか?

何も考えずに Berksfile 書くだけでホイホイ使える場合は鼻血ブーなんですけれど、エラーが出た場合はさっさと見切りを付けて、レシピを自分で書いたほうが圧倒的に早いと思います。

じゃあどうする?

先程も述べたとおり

Vagrant(環境を何度でも作り直せるナイスガイ)
+
Chef(レシピで自在に provisioning するシブいやつ)
+
Berkshelf(レシピをまとめあげ管理するイケメン)

というスタイルで使ってみる

初期設定

Vagrant
$ vagrant plugin install vagrant-vbox-snapshot

の2つだけ。vagrant-vbox-snapshot はデバックが快適になるので入れることを推奨

Chef(knife)
  • bundler 使うなりして、knife-solo を install する
  • knife configure を実行
    • 基本的には全部デフォで問題ないはず
    • ~/.chef/knife.rb を生成する
  • knife solo init を実行
    • repository の初期化を行う
    • ./.chef/knife.rb を生成
    • cookbook_path というオプションが重要。
Berkshelf
  • bundler 使うなりして、Berkshelf を install する
  • berks init は行わない
    • berk init を実行すると、自動で Vagrantfile を生成するが、これは vagrant plugin 経由で berkshelf を使うようになっているので。

レシピ適応までの流れ

1. Berksfile を適当に書く。
site :opscode
cookbook 'nginx'
2. Vagrantfile を作る

vagrant init で作成します。
先程も述べたとおり berks init で行うと、vagrant-berkshelf 経由で berkshelf を使おうとするからです。

vagrant init
3. cookbook を持ってくる

Berksfile に必要な cookbook 名を書いたら、以下のコマンドで install する。

$ berks install

デフォルトだと ./cookbooks に install します。

3. knife を実行する

いつもの knife でOK。

$ knife solo prepare vagrant@default
$ knife solo cook vagrant@default

まとめ

  • plugin 使わなくても berkshelf つかえるよ!

こんなまとめ書いておいてアレですが、後日には気が変わって vagrant plugin 最高 になってるかもしれません。

参考

Vagrantにスナップショット機能を加えるplugin、vagrant-vbox-snapshotの紹介 - Qiita [キータ]