Chef Cookbook の管理方針、The Environment Cookbook Pattern について

Chef の Cookbook の管理方針をどうしようかな〜と考えていたところ、The Environment Cookbook Pattern という方法を見つけました。

The Environment Cookbook Pattern

使い回しの効くような汎用的な Cookbook は完全に疎結合な状態で管理して、ノードに固有なサーバーの仕様を含む Cookbook とは切り離しておきたい。かつ、汎用的な Cookbook は、使い回す際には簡単に使えるようにしておきたい。これを実現する方法として、The Environment Cookbook Pattern は有効かと思います。

スポンサーリンク

The Environment Cookbook Pattern の Cookbook は5分類される

日本語の情報源としては、オリジナルを訳してまとめてある以下が分かりやすいです。

大規模にchefを使い倒すためのcookbook pattern – Qiita

The Environment Cookbook Pattern では、基本として以下の5つの Cookbook に分類されます。

1. Library Cookbook
2. Application Cookbook
3. Wrapper Cookbook
4. Base Cookbook
5. Environment Cookbook

Cookbook の数自体が全部で5つというわけではないので、そこは注意。各々の内容については、Qiita の記事が簡潔にまとまっていて分かりやすいです。

Environment Cookbook について

オリジナルのほうの記事中で、5の Environment Cookbook は、Berksfile.lock を持ち、その Berksfile.lock を SCM で管理する唯一の Cookbook であると書かれています。Qiita の記事では分からなかった、この Berksfile.lock を使った管理の部分について少々追記します。

Environment Cookbook は、サーバー環境ごとに1つの Cookbook という構成となります。各々の Berksfile.lock を、各々対象のノードごとに適用することで、その構成を保証します。ノードごとに利用する vendor の Cookbook は変わる可能性があるので、Environment Cookbook で個別に Berksfile.lock を持っておく。サードパーティ Cookbook の利用が多い、またはノードが多い場合は便利な方法だと思います。

実際には、以下の手順で実現する。以降は、オリジナル記事からの翻訳+要約中心で、まだ試してないので動作未保証です。

Environment Cookbook 内で、まず Berksfile を作成。

または、

そして、Berksfile に利用する vendor cookbook を追記。

続いて、berks vendor コマンドで vendor の cookbook をインストールして、Berksfile.lock を生成する。

これで Berksfile.lock が生成されるので、SCM(Git などバージョン管理ソフト)で管理する。

次に、Berksfile の依存関係全てを tar.gz でアーカイブする。以下のコマンドを利用。

以下のコマンドで、ノードに Cookbook を適用する。

それから、Environment Cookbook に関する命名規約が次の通り。

・Environment Cookbook は、{cookbook_name}-{environment_name} という形になります。
・{cookbook_name} は、Environment Cookbook に固有の名前。プロダクト名とかで良いはず。
・{environment_name} は、dev, staging, preview, production など環境を表す名前。

Environment Cookbook のディレクトリ構成

The Environment Cookbook Pattern のオリジナル記事を読んでもよく分からなかったのが、Environment Cookbook の実際のディレクトリの構成です。なんか複雑になりそうな印象。

vagrant init も Environment Cookbook 個別に行ったほうが良いのだろうか…などと考えていたら、Berksfile.lock を含む Environment Cookbook の具体的なディレクトリ構造の情報を見つけました。やはり Environment Cookbook の中に、Vagrantfile を作成するみたいだ。

https://github.com/berkshelf/berkshelf/issues/535#issuecomment-32687054

このようなディレクトリ構成にして、environment-cookbook/.chef/cookbooks に、berks vendor で Cookbook を入れるらしい。vagrant init も berks init も environment-cookbook 配下で行うのだろうなぁ。うーん… ややこしい。

一応、今回の調査はここまで。Cookbook の管理方針については未だに試行錯誤中ですが、この The Environment Cookbook Pattern をもう少し簡略化した方法を試しています。オリジナルのままですと、ちょっと大規模向けな感じなので。自分なりのパターンが良い感じに定まったらまとめようと思います。

注意点ですが、このエントリーで書いてることや Environment Cookbook Pattern については、まだ試してないことも多いので上手くいくかどうかは分かりません。しかし、Cookbook の効率よい管理パターンに関する情報が少ない… 初歩的で大事な部分だと思うのですけどね。みんなどうやってるのか気になります。

スポンサーリンク
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!