{"id":4544,"date":"2025-08-12T00:34:47","date_gmt":"2025-08-12T00:34:47","guid":{"rendered":"https:\/\/uplatz.com\/blog\/?p=4544"},"modified":"2025-08-12T00:34:47","modified_gmt":"2025-08-12T00:34:47","slug":"puppet-pocket-book","status":"publish","type":"post","link":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/","title":{"rendered":"Puppet Pocket Book"},"content":{"rendered":"<p><!-- Puppet Pocket Book \u2014 Uplatz (50 Expanded Cards, One-Column Colorful Layout) --><\/p>\n<div style=\"margin:20px 0;\">\n<style>\n    .wp-puppet-pb { font-family: Arial, sans-serif; max-width: 1120px; margin:0 auto; }\n    .wp-puppet-pb .heading{\n      background: linear-gradient(135deg, #f0abfc, #93c5fd); \/* light magenta -> light blue *\/\n      color:#0f172a; padding:24px; border-radius:14px;\n      text-align:center; margin-bottom:22px; box-shadow:0 8px 20px rgba(0,0,0,.10);\n      border:1px solid #dbeafe;\n    }\n    .wp-puppet-pb .heading h2{ margin:0; font-size:2rem; }\n    .wp-puppet-pb .heading p{ margin:6px 0 0; font-size:1.02rem; opacity:.95; }<\/p>\n<p>    \/* Card base *\/\n    .wp-puppet-pb .card{\n      padding:20px; border-radius:12px; border-left:8px solid transparent;\n      box-shadow:0 6px 16px rgba(0,0,0,.06); margin:16px 0;\n    }\n    .wp-puppet-pb .card h3{ margin:0 0 10px; font-size:1.15rem; color:#0f172a; }\n    .wp-puppet-pb .card p, .wp-puppet-pb .card ul, .wp-puppet-pb .card ol{\n      margin:0; color:#334155; font-size:.98rem; line-height:1.66;\n    }\n    .wp-puppet-pb ul{ margin-top:8px; padding-left:20px; }\n    .wp-puppet-pb pre{\n      background:#f8fafc; border:1px solid #e5e7eb; color:#111827;\n      padding:12px; border-radius:8px; overflow:auto; font-size:.92rem; line-height:1.55;\n      white-space:pre-wrap;\n    }\n    .mono{ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }<\/p>\n<p>    \/* Colors *\/\n    .c-blue{ background:#e0f2fe; border-left-color:#0ea5e9; }\n    .c-indigo{ background:#eef2ff; border-left-color:#6366f1; }\n    .c-violet{ background:#ede9fe; border-left-color:#8b5cf6; }\n    .c-amber{ background:#fef3c7; border-left-color:#f59e0b; }\n    .c-orange{ background:#fff7ed; border-left-color:#f97316; }\n    .c-green{ background:#ecfdf5; border-left-color:#10b981; }\n    .c-emerald{ background:#f0fdf4; border-left-color:#059669; }\n    .c-lime{ background:#dcfce7; border-left-color:#22c55e; }\n    .c-cyan{ background:#cffafe; border-left-color:#06b6d4; }\n    .c-rose{ background:#fff1f2; border-left-color:#fb7185; }\n    .c-red{ background:#fee2e2; border-left-color:#ef4444; }\n    .c-slate{ background:#f8fafc; border-left-color:#334155; }\n    .c-yellow{ background:#fef9c3; border-left-color:#eab308; }\n    .c-pink{ background:#fce7f3; border-left-color:#db2777; }\n  <\/style>\n<div class=\"wp-puppet-pb\">\n<div class=\"heading\">\n<h2>Puppet Pocket Book \u2014 Uplatz<\/h2>\n<p>50 Expanded Cards \u2022 One-Column Colorful Layout \u2022 Fundamentals \u00b7 DSL \u00b7 Hiera \u00b7 Modules \u00b7 Bolt \u00b7 PuppetDB \u00b7 Testing \u00b7 Security \u00b7 20 Interview Q&amp;A<\/p>\n<\/p><\/div>\n<p>    <!-- ===================== SECTION 1 \u2014 FOUNDATIONS (1\u201310) ===================== --><\/p>\n<div class=\"card c-blue\">\n<h3>1) What is Puppet?<\/h3>\n<p>Puppet is a declarative configuration management and automation platform. You describe the desired end state of infrastructure (packages, files, services, users, cloud resources); Puppet converges systems to that state idempotently across Linux\/Unix\/Windows and network devices.<\/p>\n<\/p><\/div>\n<div class=\"card c-green\">\n<h3>2) Architecture Overview<\/h3>\n<ul>\n<li><b>Puppet Server<\/b> (Master\/Primary): compiles catalogs from code + data.<\/li>\n<li><b>Puppet Agent<\/b>: runs on nodes, applies catalogs locally.<\/li>\n<li><b>Facter<\/b>: gathers facts (OS, IP, memory).<\/li>\n<li><b>PuppetDB<\/b>: stores facts, catalogs, reports, exported resources.<\/li>\n<li><b>Code Delivery<\/b>: r10k\/Code Manager sync control repo \u2192 environments.<\/li>\n<\/ul><\/div>\n<div class=\"card c-violet\">\n<h3>3) Catalog Compilation Flow<\/h3>\n<p>Agent sends facts \u2192 Server merges <i>site code + modules + Hiera data + classification<\/i> \u2192 compiles a <b>catalog<\/b> (ordered resources) \u2192 agent enforces locally \u2192 reports back (events, changes, metrics).<\/p>\n<\/p><\/div>\n<div class=\"card c-amber\">\n<h3>4) Declarative DSL &#038; Idempotency<\/h3>\n<pre class=\"mono\"><code>package { 'nginx': ensure => installed }\r\nservice { 'nginx': ensure => running, enable => true }\r\nfile { '\/etc\/nginx\/nginx.conf':\r\n  ensure  => file,\r\n  content => template('profile_nginx\/nginx.conf.erb'),\r\n  notify  => Service['nginx'],\r\n}<\/code><\/pre>\n<p>Re-applying configurations yields no-op if already in desired state.<\/p>\n<\/p><\/div>\n<div class=\"card c-indigo\">\n<h3>5) Resources &#038; Metaparameters<\/h3>\n<ul>\n<li><b>Ordering:<\/b> <code>require<\/code>, <code>before<\/code>, <code>notify<\/code>, <code>subscribe<\/code><\/li>\n<li><b>Tags<\/b> for selective runs; <b>refresh<\/b> events trigger service restarts.<\/li>\n<li><b>Providers<\/b> implement platform-specific actions (apt, yum, windows, systemd).<\/li>\n<\/ul><\/div>\n<div class=\"card c-cyan\">\n<h3>6) Classes &#038; Defined Types<\/h3>\n<p><b>Class<\/b> \u2014 singleton configuration unit; <b>defined type<\/b> \u2014 reusable \u201cconstructor\u201d for many instances.<\/p>\n<pre class=\"mono\"><code>class role::web { include profile::nginx }\r\ndefine profile::vhost($docroot) { ... }\r\nprofile::vhost { 'site1': docroot => '\/var\/www\/site1' }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-orange\">\n<h3>7) Roles &#038; Profiles Pattern<\/h3>\n<p><b>Profiles<\/b> wrap reusable module logic for a component; <b>Roles<\/b> compose profiles to represent a server role. Keeps site code clean and environment-agnostic.<\/p>\n<\/p><\/div>\n<div class=\"card c-lime\">\n<h3>8) Environments &#038; Control Repo<\/h3>\n<p>Multiple <b>environments<\/b> (dev\/test\/prod) isolate code. A <b>control repo<\/b> (Git) holds environment branches; r10k\/Code Manager deploys to <code>\/etc\/puppetlabs\/code\/environments\/&lt;env&gt;<\/code>.<\/p>\n<pre class=\"mono\"><code># r10k example\r\nr10k deploy environment -p  # deploy all with module dependencies<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-emerald\">\n<h3>9) Hiera: Data Outside Code<\/h3>\n<p>Place per-env\/per-site data in YAML. Lookups merge by hierarchy (org \u2192 env \u2192 role \u2192 node).<\/p>\n<pre class=\"mono\"><code># hiera.yaml (v5)\r\nversion: 5\r\nhierarchy:\r\n  - name: \"Per-node\"\r\n    path: \"nodes\/%{trusted.certname}.yaml\"\r\n  - name: \"Per-role\"\r\n    path: \"roles\/%{facts.role}.yaml\"\r\n  - name: \"Common\"\r\n    path: \"common.yaml\"<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-rose\">\n<h3>10) Secure Data with eyaml &#038; Sensitive<\/h3>\n<p>Encrypt secrets with hiera-eyaml and mark parameters as <code>Sensitive<\/code> to avoid leaking in logs.<\/p>\n<pre class=\"mono\"><code># Hiera value: password: ENC[PKCS7, ...]\r\nclass { 'db':\r\n  password => Sensitive(hiera('db::password')),\r\n}<\/code><\/pre>\n<\/p><\/div>\n<p>    <!-- ===================== SECTION 2 \u2014 LINUX\/WINDOWS & TEMPLATES (11\u201320) ===================== --><\/p>\n<div class=\"card c-blue\">\n<h3>11) Files, Templates (ERB\/EPP)<\/h3>\n<p>Generate configs with variables and facts via ERB\/EPP. Notify services on change.<\/p>\n<pre class=\"mono\"><code># ERB\r\nuser  nginx;\r\nworker_processes <%= @facts['processors']['count'] %>;<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-green\">\n<h3>12) Packages &#038; Services (Cross-Platform)<\/h3>\n<pre class=\"mono\"><code>package { $facts['os']['family'] ? {\r\n  'RedHat' => 'httpd',\r\n  'Debian' => 'apache2',\r\n  default  => 'httpd',\r\n}: ensure => present }\r\n\r\nservice { $facts['os']['family'] ? {\r\n  'RedHat' => 'httpd',\r\n  'Debian' => 'apache2',\r\n  default  => 'httpd',\r\n}: ensure => running, enable => true }<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-amber\">\n<h3>13) Users, Groups, SSH<\/h3>\n<pre class=\"mono\"><code>user { 'deploy': ensure => present, shell => '\/bin\/bash' }\r\nfile { '\/home\/deploy\/.ssh\/authorized_keys':\r\n  ensure  => file, owner => 'deploy', mode => '0600', content => hiera('deploy::keys')\r\n}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-violet\">\n<h3>14) Cron, Systemd, SELinux<\/h3>\n<pre class=\"mono\"><code>cron { 'logrotate-hourly': minute => '5', hour => '*\/1', command => '\/usr\/sbin\/logrotate \/etc\/logrotate.conf' }\r\nservice { 'nginx': provider => 'systemd', ensure => running }\r\naugeas { 'set-selinux':\r\n  context => '\/files\/etc\/selinux\/config',\r\n  changes => 'set SELINUX permissive',\r\n}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-indigo\">\n<h3>15) Windows: Packages, Services, Registry<\/h3>\n<pre class=\"mono\"><code>package { '7zip': ensure => installed, provider => 'chocolatey' }\r\nservice { 'Spooler': ensure => running, enable => true }\r\nregistry_value { 'HKLM\\Software\\Uplatz\\Key':\r\n  ensure => present, type => string, data => 'value',\r\n}<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-cyan\">\n<h3>16) Powershell &#038; DSC<\/h3>\n<pre class=\"mono\"><code>exec { 'set-exec-policy':\r\n  command => 'powershell -NoProfile -ExecutionPolicy Bypass -Command \"Set-ExecutionPolicy RemoteSigned -Force\"',\r\n  unless  => 'powershell -NoProfile -Command \"(Get-ExecutionPolicy) -eq ''RemoteSigned''\"'\r\n}<\/code><\/pre>\n<p>Use DSC resources via Puppet DSC modules where deeper Windows control is required.<\/p>\n<\/p><\/div>\n<div class=\"card c-orange\">\n<h3>17) Ordering &#038; Refresh<\/h3>\n<pre class=\"mono\"><code>file { '\/etc\/app.cfg': content => template('app\/cfg.erb'), notify => Service['appd'] }\r\nservice { 'appd': ensure => running, enable => true }<\/code><\/pre>\n<p>On change, <code>notify<\/code> sends refresh to restart\/reload services.<\/p>\n<\/p><\/div>\n<div class=\"card c-lime\">\n<h3>18) Resource Collectors &#038; Exported Resources<\/h3>\n<p>Collect resources across nodes (requires PuppetDB).<\/p>\n<pre class=\"mono\"><code># export a resource on web nodes\r\n@@sshkey { $::trusted['certname']: type => 'ssh-rsa', key => $pubkey }\r\n# collect on bastion\r\nSshkey &lt;| |&gt;<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-emerald\">\n<h3>19) Staging, Fileserver, Filebucket<\/h3>\n<ul>\n<li><b>Filebucket<\/b> stores file backups for rollback.<\/li>\n<li><b>Fileserver<\/b> serves static files\/binaries to agents.<\/li>\n<li>Stage large deployments by roles\/environments to minimize blast radius.<\/li>\n<\/ul><\/div>\n<div class=\"card c-rose\">\n<h3>20) Node Classification<\/h3>\n<p>Assign classes via <code>site.pp<\/code>, an External Node Classifier (ENC), or the PE Console. Prefer roles by <code>$trusted.certname<\/code>, facts, or groups for scale.<\/p>\n<\/p><\/div>\n<p>    <!-- ===================== SECTION 3 \u2014 CODE MGMT, TESTING & CI (21\u201330) ===================== --><\/p>\n<div class=\"card c-blue\">\n<h3>21) Control Repo Layout<\/h3>\n<pre class=\"mono\"><code>control-repo\/\r\n  \u251c\u2500\u2500 environment.conf\r\n  \u251c\u2500\u2500 hiera.yaml\r\n  \u251c\u2500\u2500 data\/ (Hiera)\r\n  \u251c\u2500\u2500 site\/ (roles, profiles)\r\n  \u2514\u2500\u2500 Puppetfile (module sources)<\/code><\/pre>\n<p>Keep site logic (roles\/profiles) here; reference third-party modules in <b>Puppetfile<\/b>.<\/p>\n<\/p><\/div>\n<div class=\"card c-green\">\n<h3>22) r10k &#038; Code Manager<\/h3>\n<p><b>r10k<\/b> deploys Git branches to environments; <b>Code Manager<\/b> (PE) adds webhook-driven deployments, RBAC, and file sync across compilers.<\/p>\n<\/p><\/div>\n<div class=\"card c-amber\">\n<h3>23) PDK (Puppet Development Kit)<\/h3>\n<pre class=\"mono\"><code>pdk new module profile_nginx\r\npdk validate\r\npdk test unit<\/code><\/pre>\n<p>Standardizes module skeletons, metadata, RuboCop\/puppet-lint rules, and rspec scaffolding.<\/p>\n<\/p><\/div>\n<div class=\"card c-violet\">\n<h3>24) Linting &#038; Style<\/h3>\n<pre class=\"mono\"><code>puppet parser validate site.pp\r\npuppet-lint site\/\r\nrubocop<\/code><\/pre>\n<p>Automate in CI to prevent bad code reaching production.<\/p>\n<\/p><\/div>\n<div class=\"card c-indigo\">\n<h3>25) Unit Tests with rspec-puppet<\/h3>\n<pre class=\"mono\"><code>it 'should compile profile::nginx' do\r\n  is_expected.to compile.with_all_deps\r\n  is_expected.to contain_service('nginx').with_ensure('running')\r\nend<\/code><\/pre>\n<\/p><\/div>\n<div class=\"card c-cyan\">\n<h3>26) Integration Tests with Beaker\/Test Kitchen<\/h3>\n<p>Spin ephemeral VMs\/containers to run <code>puppet apply<\/code> and assert system state. Gate merges on passing suites.<\/p>\n<\/p><\/div>\n<div class=\"card c-orange\">\n<h3>27) CI\/CD Pipeline (Example)<\/h3>\n<ul>\n<li>PR: lint + unit<\/li>\n<li>Merge to <code>dev<\/code>: r10k deploy \u2192 canary agent run<\/li>\n<li>Promote to <code>prod<\/code>: r10k deploy \u2192 phased rollout<\/li>\n<\/ul><\/div>\n<div class=\"card c-lime\">\n<h3>28) Environment Isolation &#038; Pins<\/h3>\n<p>Pin module versions per environment via <b>Puppetfile<\/b>. Avoid floating versions to keep runs reproducible.<\/p>\n<\/p><\/div>\n<div class=\"card c-emerald\">\n<h3>29) Performance Tuning (Server)<\/h3>\n<ul>\n<li>Right-size JVM heap; tune JRuby pool count<\/li>\n<li>Enable Code Cache\/File Sync<\/li>\n<li>Use compile masters\/load balancer in larger estates<\/li>\n<\/ul><\/div>\n<div class=\"card c-rose\">\n<h3>30) Agent Scale &#038; Scheduling<\/h3>\n<p>Stagger <code>runinterval<\/code> to avoid thundering herd; cache facts; use <b>environment_timeout<\/b> wisely to balance freshness and performance.<\/p>\n<\/p><\/div>\n<p>    <!-- ===================== SECTION 4 \u2014 INTERVIEW Q&A (31\u201350) ===================== --><\/p>\n<div class=\"card c-blue\">\n<h3>31) Q: Puppet vs Ansible vs Chef \u2014 when pick Puppet?<\/h3>\n<p><b>A:<\/b> Choose Puppet for large, long-lived fleets needing strongly typed, declarative, idempotent state with robust classification, reporting, and compliance. Its compiled catalogs, Hiera, and PuppetDB excel at scaled governance.<\/p>\n<\/p><\/div>\n<div class=\"card c-green\">\n<h3>32) Q: Class vs Defined Type?<\/h3>\n<p><b>A:<\/b> Class is singleton (declared once per node). Defined type is a template you can instantiate many times (e.g., multiple vhosts). Use classes for roles\/profiles, defined types for repeatable components.<\/p>\n<\/p><\/div>\n<div class=\"card c-amber\">\n<h3>33) Q: Order resources safely?<\/h3>\n<p><b>A:<\/b> Prefer relationship metaparameters (<code>require<\/code>, <code>before<\/code>, <code>notify<\/code>, <code>subscribe<\/code>) or dependency chains; avoid relying on declaration order.<\/p>\n<\/p><\/div>\n<div class=\"card c-violet\">\n<h3>34) Q: Hiera hierarchy design?<\/h3>\n<p><b>A:<\/b> Highest specificity \u2192 lowest: node \u2192 role\/profile \u2192 environment \u2192 common. Keep secrets in eyaml; keep data flat and predictable; document keys.<\/p>\n<\/p><\/div>\n<div class=\"card c-indigo\">\n<h3>35) Q: Prevent secret leakage in reports?<\/h3>\n<p><b>A:<\/b> Use <code>Sensitive<\/code> type for parameters, avoid <code>notify => Service[...]<\/code> on resources holding secrets, and disable debug logging on secret rendering paths.<\/p>\n<\/p><\/div>\n<div class=\"card c-cyan\">\n<h3>36) Q: What is PuppetDB used for?<\/h3>\n<p><b>A:<\/b> Central store for facts, catalogs, reports, and exported resources. Enables PQL queries, inventory, orchestration, and cross-node resource collection.<\/p>\n<\/p><\/div>\n<div class=\"card c-orange\">\n<h3>37) Q: Exported resources &#038; collectors?<\/h3>\n<p><b>A:<\/b> Nodes export resources (e.g., ssh keys) to PuppetDB; other nodes collect them via resource collectors. Great for bastion known-hosts, monitoring registrations, etc.<\/p>\n<\/p><\/div>\n<div class=\"card c-lime\">\n<h3>38) Q: PE vs Open Source Puppet?<\/h3>\n<p><b>A:<\/b> Puppet Enterprise adds RBAC, Console GUI, Code Manager, Orchestrator, compliance\/reporting, and supported modules. OSS provides the engine and community modules.<\/p>\n<\/p><\/div>\n<div class=\"card c-emerald\">\n<h3>39) Q: r10k vs Code Manager?<\/h3>\n<p><b>A:<\/b> r10k is CLI-driven Git deployer; Code Manager (PE) adds webhook integration, RBAC, file-sync, and orchestration for multi-compiler architectures.<\/p>\n<\/p><\/div>\n<div class=\"card c-rose\">\n<h3>40) Q: Testing strategy?<\/h3>\n<p><b>A:<\/b> Lint + parser validate \u2192 rspec-puppet (units) \u2192 Beaker\/Test Kitchen (acceptance) \u2192 canary environment \u2192 phased rollout. Gate merges on tests.<\/p>\n<\/p><\/div>\n<div class=\"card c-blue\">\n<h3>41) Q: Handle \u201cpoison\u201d configs safely?<\/h3>\n<p><b>A:<\/b> Use staging and canaries; apply to a small node group; monitor reports; roll back via Git revert\/r10k. For runtime failures, guard with conditionals and <code>unless\/onlyif<\/code> in <code>exec<\/code>.<\/p>\n<\/p><\/div>\n<div class=\"card c-green\">\n<h3>42) Q: Custom facts vs external facts?<\/h3>\n<p><b>A:<\/b> Custom facts (Ruby) live in modules (<code>lib\/facter<\/code>); external facts are simple scripts or files under <code>\/etc\/puppetlabs\/facter\/facts.d<\/code>. Prefer external for simplicity; custom for logic.<\/p>\n<\/p><\/div>\n<div class=\"card c-amber\">\n<h3>43) Q: When to write a custom type\/provider?<\/h3>\n<p><b>A:<\/b> When no built-in resource covers your system object, and you need idempotent lifecycle management (create\/destroy\/exists?). Keep providers minimal and testable.<\/p>\n<\/p><\/div>\n<div class=\"card c-violet\">\n<h3>44) Q: ENC vs site.pp classification?<\/h3>\n<p><b>A:<\/b> ENC centralizes node\u2192class mapping (often from CMDB). For small sites, site.pp may suffice. At scale, ENC\/Console enables role-based, fact-based grouping and auditing.<\/p>\n<\/p><\/div>\n<div class=\"card c-indigo\">\n<h3>45) Q: How to speed up compiles?<\/h3>\n<p><b>A:<\/b> Profile JRuby pool, reduce Hiera I\/O, cache template results, trim giant hierarchies, split monolith profiles, use additional compile masters behind a load balancer.<\/p>\n<\/p><\/div>\n<div class=\"card c-cyan\">\n<h3>46) Q: Agent run interval &#038; drift?<\/h3>\n<p><b>A:<\/b> Default ~30m; decrease for tighter drift control, increase for scale. For critical drift, use <code>pxp-agent<\/code> (PE) to task\/plan on demand.<\/p>\n<\/p><\/div>\n<div class=\"card c-orange\">\n<h3>47) Q: Windows package management approaches?<\/h3>\n<p><b>A:<\/b> Chocolatey provider, MSI <code>package<\/code> resources, Powershell DSC integration for complex resources, Registry resources for settings.<\/p>\n<\/p><\/div>\n<div class=\"card c-lime\">\n<h3>48) Q: Secrets patterns?<\/h3>\n<p><b>A:<\/b> Hiera eyaml + Sensitive; alternatively external secret stores (Vault) via lookup functions. Never log secrets; template carefully.<\/p>\n<\/p><\/div>\n<div class=\"card c-emerald\">\n<h3>49) Q: Puppet Bolt vs Agent runs?<\/h3>\n<p><b>A:<\/b> Bolt is agentless orchestration (tasks\/plans) for ad-hoc or day-2 ops; agent runs enforce declared state continuously. Use both: Bolt for one-off changes, Puppet for desired state.<\/p>\n<\/p><\/div>\n<div class=\"card c-rose\">\n<h3>50) Q: Quick \u201cWeb Tier\u201d design?<\/h3>\n<p><b>A:<\/b> Role <code>role::web<\/code> \u2192 profiles <code>profile::nginx<\/code>, <code>profile::php<\/code>, <code>profile::hardening<\/code>. Hiera for env data (ports, certs). Canary rollout, DL for failure reports, metrics via PuppetDB. Secrets: eyaml + Sensitive. CI: PDK lint\/tests; CD: r10k deploy + phased agent runs.<\/p>\n<\/p><\/div>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Puppet Pocket Book \u2014 Uplatz 50 Expanded Cards \u2022 One-Column Colorful Layout \u2022 Fundamentals \u00b7 DSL \u00b7 Hiera \u00b7 Modules \u00b7 Bolt \u00b7 PuppetDB \u00b7 Testing \u00b7 Security \u00b7 20 <span class=\"readmore\"><a href=\"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/\">Read More &#8230;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2462,2491],"tags":[],"class_list":["post-4544","post","type-post","status-publish","format-standard","hentry","category-pocket-book","category-puppet"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Puppet Pocket Book | Uplatz Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Puppet Pocket Book | Uplatz Blog\" \/>\n<meta property=\"og:description\" content=\"Puppet Pocket Book \u2014 Uplatz 50 Expanded Cards \u2022 One-Column Colorful Layout \u2022 Fundamentals \u00b7 DSL \u00b7 Hiera \u00b7 Modules \u00b7 Bolt \u00b7 PuppetDB \u00b7 Testing \u00b7 Security \u00b7 20 Read More ...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/\" \/>\n<meta property=\"og:site_name\" content=\"Uplatz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-12T00:34:47+00:00\" \/>\n<meta name=\"author\" content=\"uplatzblog\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:site\" content=\"@uplatz_global\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"uplatzblog\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/\"},\"author\":{\"name\":\"uplatzblog\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\"},\"headline\":\"Puppet Pocket Book\",\"datePublished\":\"2025-08-12T00:34:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/\"},\"wordCount\":1103,\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"articleSection\":[\"Pocket Book\",\"Puppet\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/\",\"name\":\"Puppet Pocket Book | Uplatz Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\"},\"datePublished\":\"2025-08-12T00:34:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/puppet-pocket-book\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Puppet Pocket Book\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"name\":\"Uplatz Blog\",\"description\":\"Uplatz is a global IT Training &amp; Consulting company\",\"publisher\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#organization\",\"name\":\"uplatz.com\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"contentUrl\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/Uplatz-Logo-Copy-2.png\",\"width\":1280,\"height\":800,\"caption\":\"uplatz.com\"},\"image\":{\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Uplatz-1077816825610769\\\/\",\"https:\\\/\\\/x.com\\\/uplatz_global\",\"https:\\\/\\\/www.instagram.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/uplatz.com\\\/blog\\\/#\\\/schema\\\/person\\\/8ecae69a21d0757bdb2f776e67d2645e\",\"name\":\"uplatzblog\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g\",\"caption\":\"uplatzblog\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Puppet Pocket Book | Uplatz Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/","og_locale":"en_US","og_type":"article","og_title":"Puppet Pocket Book | Uplatz Blog","og_description":"Puppet Pocket Book \u2014 Uplatz 50 Expanded Cards \u2022 One-Column Colorful Layout \u2022 Fundamentals \u00b7 DSL \u00b7 Hiera \u00b7 Modules \u00b7 Bolt \u00b7 PuppetDB \u00b7 Testing \u00b7 Security \u00b7 20 Read More ...","og_url":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/","og_site_name":"Uplatz Blog","article_publisher":"https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","article_published_time":"2025-08-12T00:34:47+00:00","author":"uplatzblog","twitter_card":"summary_large_image","twitter_creator":"@uplatz_global","twitter_site":"@uplatz_global","twitter_misc":{"Written by":"uplatzblog"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/#article","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/"},"author":{"name":"uplatzblog","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e"},"headline":"Puppet Pocket Book","datePublished":"2025-08-12T00:34:47+00:00","mainEntityOfPage":{"@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/"},"wordCount":1103,"publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"articleSection":["Pocket Book","Puppet"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/","url":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/","name":"Puppet Pocket Book | Uplatz Blog","isPartOf":{"@id":"https:\/\/uplatz.com\/blog\/#website"},"datePublished":"2025-08-12T00:34:47+00:00","breadcrumb":{"@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uplatz.com\/blog\/puppet-pocket-book\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/uplatz.com\/blog\/puppet-pocket-book\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uplatz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Puppet Pocket Book"}]},{"@type":"WebSite","@id":"https:\/\/uplatz.com\/blog\/#website","url":"https:\/\/uplatz.com\/blog\/","name":"Uplatz Blog","description":"Uplatz is a global IT Training &amp; Consulting company","publisher":{"@id":"https:\/\/uplatz.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uplatz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/uplatz.com\/blog\/#organization","name":"uplatz.com","url":"https:\/\/uplatz.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","contentUrl":"https:\/\/uplatz.com\/blog\/wp-content\/uploads\/2016\/11\/Uplatz-Logo-Copy-2.png","width":1280,"height":800,"caption":"uplatz.com"},"image":{"@id":"https:\/\/uplatz.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Uplatz-1077816825610769\/","https:\/\/x.com\/uplatz_global","https:\/\/www.instagram.com\/","https:\/\/www.linkedin.com\/company\/7956715?trk=tyah&amp;amp;amp;amp;trkInfo=clickedVertical:company,clickedEntityId:7956715,idx:1-1-1,tarId:1464353969447,tas:uplatz"]},{"@type":"Person","@id":"https:\/\/uplatz.com\/blog\/#\/schema\/person\/8ecae69a21d0757bdb2f776e67d2645e","name":"uplatzblog","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7f814c72279199f59ded4418a8653ad15f5f8904ac75e025a4e2abe24d58fa5d?s=96&d=mm&r=g","caption":"uplatzblog"}}]}},"_links":{"self":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/comments?post=4544"}],"version-history":[{"count":1,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4544\/revisions"}],"predecessor-version":[{"id":4545,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/posts\/4544\/revisions\/4545"}],"wp:attachment":[{"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/media?parent=4544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/categories?post=4544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uplatz.com\/blog\/wp-json\/wp\/v2\/tags?post=4544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}