chef事始め 依存関係の解決

前回の続き

cookbook・recipe間の依存関係

chefでサーバに適用するcookbookには、Chef Supermarketからダウンロードするコミュニティcookbookと自作cookbookとがあります。
ここを見ると、Environment cookbookをエントリポイントにして、wrapper cookbook→コミュニティcookbookと呼び出していくのが推奨されるやり方のようです。
ただ、具体的なやり方がよくわからなかったので悩みました。
自分なりに得た結論を以下に書いておきます。

なお、chef-serverを使うことは想定していません。
かといってchef-soloは今後開発が停止するようなのでこれも使用していません。
chef-zeroで実行することとします。
また、依存関係の解決には、Berkshelfを使用します。

例として、開発環境用にPostgreSQLApacheをインストールするとします。
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-postgresqlpostgresql、ならびにpostgresqlが依存するcookbook群が
ダウンロード&展開されます。

最終的にサーバで実行するのは、この展開されたcookbooksフォルダ以下のクックブックになります。
cookbooks以下はberks vendorされるたびにまるっと上書きされてしまうので、
クックブックの編集はsite-cookbooks以下で行い、その後berks vendorして実行という流れを忘れないようにしてください。

では、また次回