Puppet is a configuration-management system created by Luke Kanies and first released in 2005. The Puppet documentation describes the platform as one built “on the foundations of open source Puppet,” supporting “configuration management, robust security, and adherence to a desired state across global infrastructures.” Its core idea is that an administrator declares what state a system should be in, and Puppet is responsible for making the machine match that description.
Puppet is declarative and model-driven. Instead of writing a script that lists the steps to perform, administrators write resources that describe the desired condition of files, packages, services, users, and other components. Puppet builds a model of the system from these declarations and reconciles the running machine against it, repairing anything that has drifted from the stated desired state.
Configurations are written in Puppet’s own domain-specific language and stored in files called manifests. The DSL gives configuration management a dedicated, readable syntax for expressing relationships and ordering between resources. This focus on a purpose-built language for describing infrastructure was one of Puppet’s distinctive contributions and influenced how later tools approached the problem.
The traditional Puppet deployment uses an agent/master architecture. A Puppet agent runs on each managed node, periodically contacting a central server that compiles the relevant manifests into a catalog describing that node’s desired state. The agent then applies the catalog locally and reports back, so the central server holds the authoritative model while enforcement happens on each machine.
Puppet was among the tools that defined modern configuration management and helped popularize the idea of treating infrastructure as code. Written largely in Ruby, with the open-source engine developed at github.com/puppetlabs/puppet, it became a reference point against which later systems such as Chef, Salt, and Ansible were compared, particularly in debates over declarative versus imperative models and agent-based versus agentless designs.