Chef cookbooks
Cookbooks are the way to us to group our Recipes into a set of configuration instructions, give a version number and track changes in the future. A cookbook allows us to describe what a set of configuration instructions are meant to accomplish. They contain also any supporting components that the recipes might access to, such as static configuration files, templates and version control.
Generate a cookbook:
chef generate cookbook cookbooks/workstation
cookbooks/workstation - the directory where the cookbook is stored
$ tree cookbooks/
cookbooks/
`-- workstation
|-- Berksfile
|-- README.md
|-- chefignore
|-- metadata.rb
|-- recipes
| `-- default.rb
|-- spec
| |-- spec_helper.rb
| `-- unit
| `-- recipes
| `-- default_spec.rb
`-- test
`-- recipes
`-- default_test.rb
Berksfile - This file is used to manage dependencies for cookbook
chefignore - very simlar to
gitignore and
dockerignore, the directories that you will like to exclude from your Chef server. These usually are the directories
spec/ and
test/ - directories used for testing cookbook locally.
metadata.rb - contains just common information about the version, maintainer of the cookbook, licencing information, short description about how to use cookbook. Also, we can store dependencies inside the metadata file - essentially you should think about them as libraries: cookbooks can call other cookbooks and utilize recipes outside of another cookbook.
README.md - you can put here how to utilize this cookbook using Markdown syntax. When you will look in cookbooks in the Supermarket or a Github repository - you'll see the README display.
recipes - this directory intuitively contains all your recipes. There is a default recipe.
spec/ and
test/ - in the future you might want to take a Test Driven approach to building your cookbooks and your infrastructure. That's what these directories are for:
spec/ is for unit testing your cookbooks using a common Unit testing framework called RSpec for Ruby and RSpec can be used to test functionality pieces of your code do. In addition to this we have integration testing (
test/ - directory) using a framework called Test Kitchen. These are common directories to include in your
chefignore file