Chef is a configuration management system in which infrastructure is expressed as Ruby that runs in two distinct phases. During compile, the client evaluates every recipe in the run list and builds a resource collection — nothing has touched the machine yet. The converge phase then walks that collection in order, and each resource does whatever is required to reach the state it declared — or nothing at all, if the machine is already there. Almost every confusing Chef behaviour, from a variable that seems to be set too early to a notification that fires at an unexpected moment, comes back to that two-phase model.
The node is the other central object. Ohai gathers facts about the machine at the start of every run; those automatic attributes then compete with default, normal, override and force levels set in cookbooks, roles, environments and the node itself, resolved through a precedence table that is genuinely the most common source of production surprises. Chef Infra Server holds node objects, data bags, environments, roles and cookbook versions, and makes them searchable — which is how one node discovers another without a service registry.
How that code is assembled has changed. Berkshelf and environment version pinning gave way to Policyfiles, which lock an entire dependency set and run list into a single, promotable artifact — a materially different operating model, and the migration most existing estates are somewhere inside. Around it sits the tooling that makes Chef testable: Cookstyle for linting, ChefSpec for unit tests of the compile phase, Test Kitchen for converging on a real machine before a node ever sees the change, and InSpec for controls that can gate a pipeline and then be re-run against production as evidence.
Why this skill matters now
Configuration management did not disappear when containers arrived; it moved. The workloads that were easy to containerise went to Kubernetes, and what remained on virtual machines is the harder half — databases, licensed software, appliances, hosts with hardware dependencies, and the long tail of systems that a regulator, a vendor contract or a physics constraint keeps where it is. Those estates still drift, still need patching, and still need to prove they match policy.
Chef is disproportionately represented in that remaining half, because organisations that adopted it did so for large, long-lived, compliance-heavy fleets. The result is a specific and durable skills gap: plenty of engineers can write a recipe, very few can safely change a ten-year-old cookbook tree with sixteen levels of attribute precedence, an undocumented data bag dependency and no test coverage.
Separately, InSpec has developed a life of its own. Compliance teams use it as a control language against fleets that have nothing to do with Chef Infra, because a control that is executable, version-controlled and runnable on demand beats a screenshot in an evidence folder. Between estate maintenance, migration decisions and compliance-as-code, Chef skills now sell on judgement rather than novelty — which is exactly the kind of skill that is scarce.