chef事始め 依存関係の解決
前回の続き
cookbook・recipe間の依存関係
chefでサーバに適用するcookbookには、Chef Supermarketからダウンロードするコミュニティcookbookと自作cookbookとがあります。
ここを見ると、Environment cookbookをエントリポイントにして、wrapper cookbook→コミュニティcookbookと呼び出していくのが推奨されるやり方のようです。
ただ、具体的なやり方がよくわからなかったので悩みました。
自分なりに得た結論を以下に書いておきます。
なお、chef-serverを使うことは想定していません。
かといってchef-soloは今後開発が停止するようなのでこれも使用していません。
chef-zeroで実行することとします。
また、依存関係の解決には、Berkshelfを使用します。
例として、開発環境用にPostgreSQLとApacheをインストールするとします。
cookbookとしては、以下の3つを用意します。
pj-dev (開発環境用)
pj-postgresql (対象プロジェクトでのPostgreSQL設定用)
自身で作成し、バージョン管理対象とするディレクトリ・ファイルは、
以下のような構成となります。
- カレントディレクトリ
- site-cookbooks
- pj-dev
- recipes
- default.rb
- Berksfile
- metadata.rb
- pj-postgresql
- recipes
- default.rb
- Berksfile
- metadata.rb
なお、chefDKの以下のコマンドをつかうと、必要なファイルをごそっと
作ってくれるので大変便利です。
chef generate cookbook pj-dev
上記で生成したcookbook達を上のディレクトリ構成に収めたら、
実際の処理を書いていきます。
まずは、各Berksfile から見ていきます。
Berksfileはberkshelfの設定ファイルです。
これを開くと、以下のようになっているかと思います。
source "https://supermarket.getchef.com" metadata
1行目のsourceは、このサイトからコミュニティクックブックを落としてね、という意味。
3行目は、依存関係についてはmetadataを見てね、という意味になります。
というわけで次にmetadata.rbを見ます。
これを開くとcookbook名やらバージョン番号、ライセンスなど、自動生成された値が出てきます。
この辺は適宜書き換えてください。
依存関係は、このファイルの末尾に以下のように記載します。
site-cookbook/pj-postgresql/metadata.rb の場合
… depends 'postgresql', '~> 3.4.14'
postgresql クックブックのv 3.4.14に依存しまっせという意味です
同じように、pj-dev クックブックのmetadata.rbにも次のように書きます。
… depends 'pj-postgresql'
pj-postgresql クックブックに依存しまっせという意味です
ところがこれだけではberkshelfがpj-postgresqlをopscodeのサイトから探そうと
してしまうので、pj-postgresqlの場所を別途指定してあげる必要があります。
そのため、pj-devクックブックのBerksfileに以下を追記します。
cookbook 'pj-postgresql', path: '../pj-postgresql'
これで、metadata内にあるpj-postgresqlの場所が解決できます。
ほかに場所の指定方法として、gitリポジトリやgithubも指定できます。
cookbook "mysql", git: "https://github.com/opscode-cookbooks/mysql.git", branch: "foodcritic" cookbook "artifact", github: "RiotGames/artifact-cookbook", tag: "0.9.8"
設定が完了したところでberksfileを実行します。
berks vendor cookbooks -b site-cookbooks/pj-dev/Berksfile
berks vendor [PATH]はPATH以下にクックブックを展開する、というコマンドです。
-bオプションは実行するBerksfileのパスを指定します。
上記の例でこれを実行すると、cookbooksディレクトリに、
pj-dev、pj-postgresql、postgresql、ならびにpostgresqlが依存するcookbook群が
ダウンロード&展開されます。
最終的にサーバで実行するのは、この展開されたcookbooksフォルダ以下のクックブックになります。
cookbooks以下はberks vendorされるたびにまるっと上書きされてしまうので、
クックブックの編集はsite-cookbooks以下で行い、その後berks vendorして実行という流れを忘れないようにしてください。
では、また次回