scramble cadenza

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

berkshelf で path を変更した場合は、knife[:berkshelf_path] を変える。

イントロ

これに気づかなくて結構ハマった。

症状

berkshelf を使って、cookbook を install するとき、bundler 風に以下のように path を変えた。

berks install --path vendor/cookbooks

すると cookbook が見つからないと怒られ始めた。

================================================================================
Recipe Compile Error
================================================================================

Chef::Exceptions::RecipeNotFound
--------------------------------
could not find recipe user for cookbook rbenv

[2014-01-12T21:50:03+09:00] ERROR: Running exception handlers
[2014-01-12T21:50:03+09:00] ERROR: Exception handlers complete
[2014-01-12T21:50:03+09:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 0 resources updated
[2014-01-12T21:50:03+09:00] ERROR: could not find recipe user for cookbook rbenv
[2014-01-12T21:50:03+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
ERROR: RuntimeError: chef-solo failed. See output above.

という風に、cookbook が見つからないと怒られる。
Stacktrace を見てもいまいちわからず。

原因

berkshelf 経由で install してきた cookbook の path を設定していなかったのが原因。
本来は .chef/knife.rb の knife[:berkshelf_path] に入っているレシピを参照する。

cookbook_path    ["cookbooks", "site-cookbooks"]
node_path        "nodes"
role_path        "roles"
environment_path "environments"
data_bag_path    "data_bags"
#encrypted_data_bag_secret "data_bag_key"

knife[:berkshelf_path] = "cookbooks"

berkshelf で install 先を変更しても、ここの path が変わらないければ当然見つけられないわけです。

解決策

.chef/knife.rb を編集する

-knife[:berkshelf_path] = "cookbooks"
+knife[:berkshelf_path] = "vendor/cookbooks"

デフォルトの berks install は cookbooks 配下にインストールを行います。
だから何も path を付けずに install を行うには問題ないのです。

けど vendor/cookbooks など別の場所を指定して install した場合は、この設定を修正しないと cookbook ねーよ、と言われてしまうので要注意。