A cookbook is the fundamental unit of configuration and policy distribution. A cookbook defines a scenario and contains everything that is required to support that scenario:
- Recipes that specify the resources to use and the order in which they are to be applied
- Attribute values
- File distributions
- Extensions to Chef, such as libraries, definitions, and custom resources
The chef-client uses Ruby as its reference language for creating cookbooks and defining recipes, with an extended DSL for specific resources. The chef-client provides a reasonable set of resources, enough to support many of the most common infrastructure automation scenarios; however, this DSL can also be extended when additional resources and capabilities are required.
Some important components of cookbooks include:
|Attributes||An attribute can be defined in a cookbook (or a recipe) and then used to override the default settings on a node. When a cookbook is loaded during a chef-client run, these attributes are compared to the attributes that are already present on the node. Attributes that are defined in attribute files are first loaded according to cookbook order. For each cookbook, attributes in the default.rb file are loaded first, and then additional attribute files (if present) are loaded in lexical sort order. When the cookbook attributes take precedence over the default attributes, the chef-client will apply those new settings and values during the chef-client run on the node.|
A recipe is the most fundamental configuration element within the organization. A recipe:
The chef-client will run a recipe only when asked. When the chef-client runs the same recipe more than once, the results will be the same system state each time. When a recipe is run against a system, but nothing has changed on either the system or in the recipe, the chef-client won’t change anything.
In addition to attributes and recipes, the following items are also part of cookbooks:
|Definitions||A definition is used to create new resources by stringing together one (or more) existing resources.|
|Files||A file distribution is a specific type of resource that tells a cookbook how to distribute files, including by node, by platform, or by file version.|
|Libraries||A library allows the use of arbitrary Ruby code in a cookbook, either as a way to extend the chef-client language or to implement a new class.|
|Custom Resources||A custom resource is an abstract approach for defining a set of actions and (for each action) a set of properties and validation parameters.|
|Metadata||A metadata file is used to ensure that each cookbook is correctly deployed to each node.|
|Resources and Providers||A resource is a package, a service, a group of users, and so on. A resource tells the chef-client which provider to use during a chef-client run for various tasks like installing packages, running Ruby code, or accessing directories and file systems. The resource is generic: “install program A” while the provider knows what to do with that process on Debian and Ubuntu and Microsoft Windows. A provider defines the steps that are required to bring that piece of the system into the desired state. The chef-client includes default providers that cover all of the most common scenarios. For the full list of resources that are built-in to the chef-client, see https://docs.chef.io/resources.html.|
|Templates||A template is a file written in markup language that uses Ruby statements to solve complex configuration scenarios.|
A cookbook version represents a set of functionality that is different from the cookbook on which it is based. A version may exist for many reasons, such as ensuring the correct use of a third-party component, updating a bug fix, or adding an improvement. A cookbook version is defined using syntax and operators, may be associated with environments, cookbook metadata, and/or run-lists, and may be frozen (to prevent unwanted updates from being made).
A cookbook version is maintained just like a cookbook, with regard to source control, uploading it to the Chef server, and how the chef-client applies that cookbook when configuring nodes.
Chef maintains a large collection of cookbooks. In addition, there are thousands of cookbooks created and maintained by the community:
|Cookbooks Maintained by Chef||Chef maintains a collection of cookbooks that are widely used by the community.|
|Cookbooks Maintained by the Community||The community has authored thousands of cookbooks, ranging from niche cookbooks that are used by only a few organizations to cookbooks that are some of the most popular and are used by nearly everyone.|