Why can't chef resolve my cookbooks?
Make sure you have configured your chef_repo_path
as described in the docs.
Basically local-mode
needs to know where to find your cookbooks, roles, environments, data bags, etc. Sadly, the documentation is not super clear on where/how you set chef_repo_path
Here's what I can tell from the code.
- if
client.rb
is found and containscookbook_path
,chef_repo_path
="#{cookbook_path}/.."
- if
knife.rb
is found and containscookbook_path
,chef_repo_path = "#{cookbook_path}/.."
- Chef can try to divine the path. The code will search from
pwd
upward looking for a directory calledcookbooks
. If it finds it, thencookbooks/..
will be set as your chef_repo_path. - If all else fails,
pwd
will be used as yourchef_repo_path
If you are using Berkshelf, your best bet is to do a berks vendor
in order to get a single directory will ALL of the cookbooks you need. You can then point chef_repo_path to the parent of the cookbooks
directory which holds your vendored cookbooks.
Mind you, that's from 10 minutes of digging in the source code, so I may not have it quite right.
While looking to run locally for testing I ran into the same "cannot resolve cookbook" error. Since I potentially want to run cookbooks without a Chef server but also without ChefDK installed for non-Chef developers to do a simple one time workstation setup, I put together the following workflow.
Your cookbook needs to live in a folder under a folder called cookbooks, this appears to be hardcoded "magic", but it seems to be able to live anywhere, eg userdir/projects/cookbooks/my_cookbook_name/
.
If you have a Berksfile for the dependencies you need to get them locally before you can run chef-client -z -o my_cookbook_name
so run berks vendor
to pull the dependencies into a cookbooks
directory in the current folder.
The berks vendor
command pulls your other dependencies into the cookbooks directory so chef-zero/chef-solo can find them. Run the following in an Administrator PowerShell prompt, it may be Command Prompt
compatible but I try not to encourage using cmd.exe.
cd /path/to/cookbooks/my_cookbook_name
berks vendor .
chef-client -z -o my_cookbook_name
The beauty of using the new chef-zero built into the client is you don't necessarily need the full ChefDK to test, though you will need berkshelf for the berks command on at least 1 machine as getting that installed without the ChefDK is a nightmare. Once you have berks
you can run berks package
and copy the file it creates to a machine with just the chef-client and extra it somewhere and then run the chef-client -z -o your_cookbook
in the directory containing the cookbooks
folder.
To get just chef use the omnibus installer and you have enough to bootstrap a node or run the recipe.
. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chef
If you need your berks and want a quick way to get the ChefDK, this will do the trick.
. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chefdk