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 ねーよ、と言われてしまうので要注意。