Setting your knife.rb cookbook_path to match your cookbook locations

This tip explains how configuring `cookbook_path` in `knife.rb` removes confusion around where Knife creates and locates cookbooks. With sensible path entries, cookbook upload and creation commands work consistently across common working directories.

Coveros Staff

October 7, 2014


Always make sure you set your cookbook_path in knife.rb to something that makes sense for your working environment.

People often get confused by how/where the ‘knife’ command is finding cookbooks during commands like “knife cookbook upload” or even “knife cookbooks create.” I remember when I first leaned Chef, I would type “knife cookbook create foo_book” and watch the output as Knife happily created it for me. However, then I looked around and couldn’t find it anywhere. If I stumbled around the file system, I might eventually find it in some bizarre place like ~/chef-repo/cookbooks. Similarly, when I cloned a cookbook and tried to upload it with “knife cookbook upload” it would complain “ERROR: Could not find cookbook foo_book in your cookbook path, skipping it” even though I could see it right there in my directory!

The answer to this is simple: manipulate the “cookbook_path” variable in your ~/.chef/knife.rb file to point to the right location.

For example, when I work with Chef on one of my projects, I have the following directory set up for all my cookbooks:

~/git/chef/

This more-or-less contains all the cookbooks that I use. We follow the “one-cookbook-per-repository” pattern, so each cookbook tends to be in its own git repository sub-dir within that directory. In some cases, I have odd-ball cookbooks off in some other locations.

My ~/knife.rb file has the following settings:

cookbook_path [ '.', '..', './cookbooks', '~/git/chef' ]

This means that Chef (or Knife, really) will look for ./foo, ../foo, ./cookbooks/foo, and ~/git/chef/foo any time I make it look for the cookbook “foo.” This means I can do the following:

cd ~/git/chef knife cookbook upload foo

and things will work the way I expect them. That is, it will find “foo” subdir in my current directory and properly upload it. In fact, since I have cookbook path entries set up, I could really be almost anywhere. When I use the command

knife cookbook upload foo

it means that knife uses the cookbook_path and works from a variety of directory locations where I might be. Consider each cookbook_path entry:

.: works from ~/git/chef ..: works from ~/git/chef/foo ./cookbooks: not relevant, since I don't have a cookbooks/foo anywhere ~/git/chef: finds '~/git/chef/foo' no matter what directory I am in

Similarly, when I run knife cookbook create baz, it uses the first entry of my cookbook path and creates a “./baz” directory with my new cookbook.

Moral of the story: always set your cookbook_path. Never accept the default.

Coveros Staff

Coveros Staff

This post represents the collective insights of the Coveros team. Our staff consists of software experts who bring deep experience in secure agile development, DevOps, testing, and software quality. Over the past 20 years, Coveros has trained more than 30,000 professionals and worked with half of the Fortune 100 companies on mission-critical software development challenges. We draw on this extensive experience to share practical insights, proven strategies, and real-world solutions that help organizations build better software faster and more securely.