Puppet works as a transaction between an agent and a server. The agent gathers facts about its machine with Facter and requests a catalog. The server determines which classes apply to that node through classification, compiles the manifests and Hiera data into a catalog — a directed graph of resources with dependencies resolved — and returns it. The agent then enforces that catalog locally and sends back a report of what it changed. Compilation happening before anything is touched is the defining property: conflicting resources, dependency cycles and undefined variables are caught at compile time rather than halfway through a run.
Trust between those two halves is established by certificates. The server runs a certificate authority, agents submit signing requests, and every subsequent catalog request is authenticated by that certificate. It is unglamorous and it is where a large share of real incidents originate, because certificates expire, hostnames change and an estate that has run for years eventually meets both.
The language is genuinely declarative. Resources have types, titles and attributes; classes group them; defined types instantiate a pattern repeatedly; and the roles-and-profiles pattern gives a codebase a shape that survives growth — a node has exactly one role, a role includes profiles, and profiles wrap component modules with organisational decisions. Data lives outside the code in Hiera, layered by environment, node group or fact, so one module serves every environment without conditionals scattered through the manifests. Around that sit the pieces that make an estate operable: PuppetDB storing catalogs, facts and reports and making them queryable; exported resources for cross-node coordination; r10k or Code Manager deploying environments from Git branches; the Puppet Development Kit with puppet-lint and rspec-puppet for testing; and Bolt for the imperative tasks that do not belong in a catalog at all.
Why this skill matters now
The estates Puppet manages did not go away; the people who built them did. Configuration management is now largely a maintenance discipline, and maintenance of a declarative system with layered data, node classification and a certificate authority is genuinely harder than writing it was in the first place. Organisations discover this when the original team has moved on and a routine change produces an outcome nobody predicted.
Compliance made it worse and more valuable at the same time. An estate that continuously enforces state and reports corrective change is exactly what an auditor wants, so Puppet's report data has become evidence. But evidence only holds if classification is understood, if Hiera resolution is deterministic, and if nobody has been making manual changes that the next run silently reverts. Teams need people who can explain, precisely, why a node has the configuration it has.
The third driver is modernisation under constraint. Most large Puppet estates need the same set of improvements — data moved out of manifests into Hiera, code restructured into roles and profiles, modules tested before deployment, environments deployed from Git rather than by hand, and Bolt used for the orchestration work that was awkwardly forced into catalogs. Those changes have to be made on a running estate without a freeze, which is a different and scarcer skill than greenfield authoring, and it is what the market currently pays for.