- 更新日: 2014年7月13日
- Vagrant & Chef
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 を作成。
1 2 3 |
$ berks init |
または、
1 2 3 |
$ vi Berksfile |
そして、Berksfile に利用する vendor cookbook を追記。
続いて、berks vendor コマンドで vendor の cookbook をインストールして、Berksfile.lock を生成する。
1 2 3 |
$ berks vendor <cookbook-install-path> |
これで Berksfile.lock が生成されるので、SCM(Git などバージョン管理ソフト)で管理する。
次に、Berksfile の依存関係全てを tar.gz でアーカイブする。以下のコマンドを利用。
1 2 3 |
$ berks package |
以下のコマンドで、ノードに Cookbook を適用する。
1 2 3 |
$ berks apply <environment-name> |
それから、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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
environment-cookbook |_ .chef |_ knife.rb |_ cookbooks |_ environments |_ data_bags |_ roles |_ nodes |_ Berksfile |_ Berksfile.lock |_ metadata.rb |_ Vagrantfile |_ recipes |_ attributes |_ etc... |
このようなディレクトリ構成にして、environment-cookbook/.chef/cookbooks に、berks vendor で Cookbook を入れるらしい。vagrant init も berks init も environment-cookbook 配下で行うのだろうなぁ。うーん… ややこしい。
一応、今回の調査はここまで。Cookbook の管理方針については未だに試行錯誤中ですが、この The Environment Cookbook Pattern をもう少し簡略化した方法を試しています。オリジナルのままですと、ちょっと大規模向けな感じなので。自分なりのパターンが良い感じに定まったらまとめようと思います。
注意点ですが、このエントリーで書いてることや Environment Cookbook Pattern については、まだ試してないことも多いので上手くいくかどうかは分かりません。しかし、Cookbook の効率よい管理パターンに関する情報が少ない… 初歩的で大事な部分だと思うのですけどね。みんなどうやってるのか気になります。
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!