Open-source project
chef/chef avatar
chef/chef

Chef Infra: what chef/chef actually ships, and what it leaves to you

Chef Infra, a powerful automation platform that transforms infrastructure into code automating how infrastructure is configured, deployed and managed across any environment, at any scale

8,247 stars2,519 forksRubyApache-2.0

At a glance

What is it?
Chef Infra turns machine configuration into versioned Ruby recipes applied by an agent. This review covers the repository layout, the release cadence, and the cases where a simpler tool wins.
Who is it for?
Adopt Chef Infra when you already run a fleet large enough that per-host shell scripts have become unauditable, and when you are willing to run a Chef Infra Server or Chef Automate alongside the client. Do not adopt it for a single VM or a container image, where a Dockerfile or a cloud-init script is shorter and has no agent to maintain.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Ruby, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem Chef Infra solves, and the team it assumes

Configuration drift is the problem. A fleet of machines that were identical on the day they were provisioned stop being identical the moment someone edits a config file by hand. Chef Infra's answer is to describe the desired state of a machine in code and let an agent enforce it. The README calls it "a configuration management tool designed to bring automation to your entire infrastructure", and the repository topics list cfgmgt and deployment alongside automation.

The team it assumes is a platform or infrastructure group that owns machines on behalf of other engineers. That is a real constraint. Chef Infra asks you to write Ruby, to package that Ruby as cookbooks, and to run something that distributes those cookbooks to nodes. A two-person startup with three servers gets little from this. A group managing several hundred long-lived VMs, where a base image cannot express everything and where audit evidence matters, gets a lot.

The repository itself is the client. The README says plainly that "this repository is primarily for reporting issues in the chef-client itself", so if you file a bug against a cookbook or against the server, you are in the wrong tracker.

How the client, the cookbooks and the server fit together

The repository layout shows the split. lib/ holds the client implementation, chef-config/ holds configuration handling, chef-utils/ holds shared helpers, chef-bin/ holds the executable entry point, and distro/, habitat/ and Dockerfile describe how the client is packaged for different targets. kitchen-tests/ and spec/ hold the test suites that the CI badges at the top of the README point at: lint, kitchen, unit_specs and func_spec.

The data flow is a pull model. A node runs the chef-client, which resolves its run list, fetches the cookbooks it needs, compiles the recipes into a resource collection, and then converges each resource in order. Resources are the unit of work: a package resource installs a package, a template resource writes a file from an ERB template. Convergence is the point where the description becomes reality, and it is also where most surprises live, because the order resources run in is the order you declared them.

The architecture assumes a server unless you deliberately avoid one. Chef Infra Server or Chef Automate stores cookbooks, node data and policy, and the client talks to it. You can run the client against local cookbooks, which is useful for testing, but the design intent is centralised policy with distributed enforcement.

One detail worth reading carefully: the Dockerfile installs the client through Habitat, using hab pkg install with a channel argument. The default in that file is CHANNEL=unstable with VERSION=19.3.16, and the comment above it says to change back to stable when 19.x is GA. If you build from that Dockerfile unmodified, you are pulling an unstable channel build.

Installing the client and running a first recipe

The README does not give install commands. It points to Learn Chef as the free self-paced learning platform and to docs.chef.io for documentation, and it links the source tree. So the honest starting point is: get the client from the Chef documentation or from the packaging described in this repository, not from a command in the README.

What the repository does give you is the build path. The Dockerfile builds an image on top of busybox, downloads Habitat, and installs the chef/hab package with a channel argument. That is the packaging route Chef uses for containers, and it takes a secret mount for the Habitat auth token rather than an environment variable. These are the lines the Dockerfile actually contains:

dockerfile
FROM busybox
ARG CHANNEL=unstable
ARG VERSION=19.3.16
ARG ARCH=x86_64
ENV HAB_LICENSE="accept-no-persist"

That is as far as the repository takes you on installation. The README defers usage to Learn Chef and to docs.chef.io, and it does not document a first converge, a cookbook layout or a knife command. Anyone telling you otherwise is describing a different source.

What the repository does document is how its own tests run. The CI badges name lint, kitchen, unit_specs and func_spec, and the kitchen-tests/ directory holds the integration tests that converge cookbooks on real instances. If you are evaluating the project rather than adopting it, reading kitchen-tests/ tells you more about intended behaviour than the README does.

Where Chef Infra is the wrong tool

The clearest failure mode is treating it as a provisioning tool. Chef Infra converges an already-running machine. It does not create the machine. If your problem is "spin up ten instances with a load balancer", you want Terraform or a cloud provider's own tooling, and you will end up running both anyway.

Containers are the second mismatch. A container image is built once and is immutable by convention. Baking an agent into it so the agent can rewrite files at start time fights that convention and adds a process to supervise. The Dockerfile in this repository exists to produce a client image, which is useful for running chef-client in CI or against remote nodes, not as evidence that Chef belongs inside every application image.

The third case is a small, hand-managed fleet. Chef Infra has a real operational surface: a server, cookbook versioning, roles or policyfiles, and a Ruby dependency chain through the Gemfile. A team of two with five servers will spend more time maintaining that surface than they save.

There is also a versioning trap. The recent releases listed for this repository include v15.8.23 from 2020-02-20, 15.1.36 from 2019-07-01 and 11.18.14 from 2015-07-09, while the Dockerfile references 19.3.16. The repository's release tags do not line up neatly with the version the packaging defaults to, so pin your client version explicitly and read the release and support schedule document rather than assuming the newest tag is the newest client.

Alternatives and the actual difference in approach

Ansible is the comparison most teams make. The difference is architectural, not cosmetic. Ansible is agentless: it opens SSH to each host, pushes a module, and returns. Chef Infra installs an agent that pulls policy and converges on its own schedule. Agentless means nothing to install on the node and an easier first hour. Agent-based means a node can converge without inbound SSH from a control machine, and the server holds a record of what each node last reported. If your environment cannot or will not accept an always-on agent, that single fact decides the choice.

Puppet is closer in shape: an agent, a declarative resource language, a central server. The practical difference for most people is the language. Chef recipes are Ruby, so you can write loops, conditionals and helper methods directly in a recipe. Puppet has its own DSL. Ruby is a genuine advantage if your team already writes it, and a genuine hazard if it does not, because a recipe is arbitrary code and can do anything a Ruby script can.

For image-based infrastructure, the honest alternative is not another configuration manager. It is a Dockerfile plus a build pipeline. If every machine you run is a container, Chef Infra is solving a problem you have already designed away.

Maintenance, release cadence and the licence

The repository is not archived, and the last push was on 2026-09-21. The README links a release and support schedule document and a release cadence design document, and describes monthly feature releases with yearly major releases. The README also states an issues response time maximum of 14 days and a pull request response time maximum of 14 days, under the project's Active state definition.

The upgrade cost is the part that catches people. A major release can change resource behaviour, and cookbooks written against an older client may need edits. Because the client is distributed as a package and, per the Dockerfile, through Habitat channels, you control the version you install, and you should. Read RELEASE_NOTES.md before moving a fleet across a major version; that file exists in the repository root for exactly this purpose.

The licence is Apache-2.0. The README carries the standard Apache text: licensed under the License, Version 2.0, distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND. That is a permissive licence, but it also means the warranty disclaimer is the whole of the legal promise. Note the separate COPYRIGHT.md, and note that the README does not discuss the licensing of cookbooks you pull from the community, which is a question for each cookbook's own repository. None of this is legal advice; if you are redistributing a bundled client, read the NOTICE file alongside the LICENSE.

Editorial conclusion

Adopt Chef Infra when you already run a fleet large enough that per-host shell scripts have become unauditable, and when you are willing to run a Chef Infra Server or Chef Automate alongside the client. Do not adopt it for a single VM or a container image, where a Dockerfile or a cloud-init script is shorter and has no agent to maintain. Before committing, verify three things: which release channel your package comes from (the Dockerfile defaults to CHANNEL=unstable with VERSION=19.3.16), whether the community cookbooks you depend on are still receiving commits, and whether your team can read Ruby well enough to review a recipe the way it reviews application code.

Frequently asked questions

What is Chef Infra and who is it for?

Chef Infra is a configuration management tool that describes infrastructure as code and applies it with an agent. The README frames it as bringing automation to an entire infrastructure, and the repository topics include cfgmgt, automation and deployment.

Does the chef/chef repository include the server?

No. The README states that the repository is primarily for reporting issues in the chef-client itself, and directs issues about other Chef projects to the appropriate repository. The server side lives elsewhere.

What licence is Chef Infra released under?

Apache-2.0. The README reproduces the Apache License, Version 2.0 text and notes the software is distributed on an AS IS basis, without warranties or conditions of any kind.

How is the Chef Infra client packaged for containers?

The repository's Dockerfile builds from busybox, installs Habitat, and then installs the chef/hab package with a channel argument. Its defaults are CHANNEL=unstable and VERSION=19.3.16, with a comment saying to switch back to stable when 19.x is generally available.

Official sources

  1. chef/chef on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
For maintainers

Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/chef-chef.svg)](https://hysenlabs.com/projects/chef-chef)
Community notes

Community notes