Before writing your first manifest, prepare the basic skills and Puppet environment: an understanding of Linux and Ruby, the concepts of declarative configuration management, and the installation of Puppet, PDK, and a test node.

Welcome to the Learn Puppet series! This series will take you from zero to mastery of Puppet — the infrastructure-as-code platform that pioneered configuration management — starting with core concepts and architecture, manifests and resource types, all the way to modules, Hiera, PuppetDB, Bolt, and Puppet Enterprise. Dozens of episodes will build your understanding layer by layer until you're ready to apply it in production.
But before writing your first manifest, there are a few basic skills and tools you need to prepare first. Why do these prerequisites matter? Because Puppet isn't just a language for writing configuration — it's a system that lives on the network, relying on SSL for agent authentication, DNS so agents can find the server, and a solid understanding of Linux so you can read the state of the servers you manage. If the foundation isn't ready, certificate and DNS errors will feel like a puzzle with no end.
Episode 0 is your roadmap: we'll prepare the basic skills, install the tools, and then make sure your first Puppet environment is up and running.
Puppet manages Linux servers, so you should master these three areas:
| Area | What you need to master | Example commands |
|---|---|---|
| Package manager | Install, update, remove packages | apt install, dnf install |
| Service management | Start, stop, enable services | systemctl start, systemctl enable |
| Users & permissions | Create users, manage file access rights | useradd, chmod, chown |
Why does this matter? Because most of the resources you'll write in Puppet — package, service, file, user — essentially automate what you currently do manually with the commands above.
Puppet follows the declarative model: you declare the desired state rather than writing a sequence of steps to reach that state. Two key concepts:
Compare this with imperative scripting: you write step by step, and if the first step has already run, the script can break the state. This declarative paradigm is what makes Puppet a great fit for thousands of nodes.
Puppet's manifest language uses syntax that resembles Ruby. You don't need to be a Ruby programmer, but understanding the basic syntax will help a lot:
$ like $domain.include profile::web.package resource type is written as package { 'nginx':{:puppet} } with parameters inside the block.We'll write complete manifests in episodes 4 and 5, so no need to go deeper right now.
Puppet agents communicate with the Puppet server over the network, and trust is built on SSL certificates. Every agent generates a certificate signing request that the server must approve. You also need to understand DNS, because agents find the server through a FQDN like puppet.example.com — not a raw IP.
Note
Clean DNS configuration will save you a lot of time in episode 3. If your lab doesn't have a DNS server, use /etc/hosts entries on all nodes — for lab scale this approach is good enough.
| Tools | Function | Notes |
|---|---|---|
| Puppet Server | Central server that compiles catalogs | OSS 8.x or Puppet Enterprise |
| Puppet Agent | Agent running on every node | Installed on all managed nodes |
| PDK | Puppet Development Kit | Module scaffolding and testing |
| Test node | Management target | VM or container |
| Forge account | Download community modules | Optional |
Puppet can be installed from the official repos apt.puppetlabs.com (Debian/Ubuntu) or yum.puppetlabs.com (RHEL family). For a lab, Puppet OSS 8.x is more than enough. Puppet Enterprise (PE) 2025.1.x is also available with a free license for up to 10 nodes — you can try it later in episode 3.
wget https://apt.puppetlabs.com/puppet8-release-focal.deb
sudo dpkg -i puppet8-release-focal.deb
sudo apt updatesudo rpm -Uvh https://yum.puppetlabs.com/puppet8-release-el-9.noarch.rpm
sudo dnf updateImportant
Choose the repo file that matches your OS version. The focal code refers to Ubuntu 20.04, jammy to 22.04, and el-9 to the RHEL 9 family. Using the wrong repo will make the package manager fail to find the packages.
Don't want to clutter your main system? Puppet provides official images on Docker Hub: puppet/puppetserver for the server and puppet/puppet-agent for agents. This is the fastest way to get a lab started.
docker run --name puppetserver --hostname puppetserver.example.com -d puppet/puppetserver
docker run --name agent --hostname agent.example.com -d puppet/puppet-agentPDK is the tool for scaffolding Puppet modules, writing unit tests, and validating syntax. We'll use it intensively starting in episode 5, so install it now.
sudo apt install pdk -yPrepare at least one test node — a VM or container — that will be the first target you manage. This node must be able to reach the server and have correct name resolution.
Puppet Forge is the community module registry at forge.puppet.com. Creating an account isn't required to read and use modules, but it will be useful if you later want to publish your own modules.
Once all tools are installed, make sure everything works:
puppet --version
pdk --version
which facterYou can also check basic facts about the test node with facter to make sure the node is recognized:
facter os.name
facter networking.ipTip
Note the installed Puppet version. In episode 4, small version differences can affect how you write certain resources — which is why the puppet --version command is always there. Get into the habit of mentioning your Puppet version when asking questions on forums or Slack.
puppet --version runs normally.In this episode 0 you've laid the groundwork for the entire series: understanding the basic Linux skills, IaC concepts, Ruby syntax, and networking that form Puppet's foundation, installing the tools you need (Puppet Server, Puppet Agent, PDK, test node), and verifying that your environment is ready to use.
Key takeaways:
In the next episode, episode 1, we'll cover history, background, and why the world needed Puppet — from the era of manual scripting, the birth of CFEngine in 1993, the arrival of Puppet by Luke Kanies in 2005, to how Puppet compares with Chef, Ansible, and SaltStack. Make sure your lab is standing, because the Learn Puppet journey is just getting started!