At its simplest, the process of developing infrastructure with Chef looks like this:
Declare policy using resources
Collect resources into recipes
Package recipes and supporting code into cookbooks
Apply cookbooks to nodes using roles
Run Chef to configure nodes according to their assigned roles
Resources are the very essence of Chef—the atoms, if you like. When we talk about a complicated, or even a simple infrastructure, that conversation takes place at a level of resources. For example we might discuss a webserver—what are the components of a webserver? Well, we need to install Apache, we need to specify its configuration and perhaps some virtual hosts, and we need to ensure the Apache service is running. Immediately, we’ve identified some resources—a package, a file, and a service.
Managing infrastructure using Chef is a case of specifying what resources are needed and how they interact with one another. We call this “setting the policy.”
If resources are the fundamental configuration objects, nodes are the fundamental things that are configured. When we talk about nodes, we’re typically talking about a machine that we want to manage. A concise definition of what Chef does is this:
“Chef manages resources on the node so they comply with policy.”
It’s important to understand that when we talk about resources in Chef, we’re not talking about the actual resource that ends up on the box. Resources in Chef are an abstraction layer. In the case of our scenario, it ...