class puppet { 'at SimilarWeb':
name => 'shamil',
ensure => present,
require => Group['devops']
}
Before we dive in
Let’s talk about Puppet DSL gotchas
What is Puppet DSL
● Configuration language
● Declarative as possible
● Similar to how you write configuration files
● Can be extended with Ruby API
Building blocks:
● Resources
● Classes
● Nodes
Official Docs:
https://docs.puppetlabs.com/puppet/3.8/reference/lang_summary.html
Resources, Classes & Nodes
Resources:
The fundamental unit for modeling system configurations. Each resource
describes some aspect of a system, like a service that must be running or a
package that must be installed.
Classes:
Group of resources.
Nodes:
Built-in node classification.
Built-in resource types
Example
# Class
class java($version = '1.7') {
# Resource
package { 'jdk':
ensure => $version
}
}
# Built-in node classificator
node default {
include java
}
# Include like
include java
# Resource like
class { 'java': }
VS
Declaring Classes
include java
include java
Multiple class declarations
class { 'java': }
include java
include java
class { 'java': }
include java
include java
Multiple class declarations
class { 'java': }
include java
include java
class { 'java': }
include java
include java
Multiple class declarations
class { 'java': }
include java
include java
class { 'java': }
include java
include java
Multiple class declarations
class { 'java': }
include java
include java
class { 'java': }
Namespacing
class hadoop::java {
`include java
}
Namespacing
class hadoop::java {
include java
}
class hadoop::java {
include hadoop::java
}
Namespacing
class hadoop::java {
include java
}
class hadoop::java {
include hadoop::java
}
class hadoop::java {
include ::java
}
Puppet
Roles and Profiles pattern
Design diagram
Resources
Component Modules
Profiles: Group of components
Roles: Group of profiles
(represent Business Logic)
Node classifier
(built-in, or external)
Hiera
(data)
Resource Example
package { 'ntp':
ensure => installed,
notify => Service['ntpd']
}
Component Example
class ntp ($ntp_server) {
package { 'ntp':
ensure => installed
}
augeas { '/etc/ntp.conf':
incl => '/etc/ntp.conf',
lens => 'Ntp.lns',
changes => ['rm server[.]', "set server ${ntp_server}"],
require => Package['ntp'],
notify => Service['ntpd']
}
service { 'ntpd':
name => $::osfamily ? { 'Debian' => ntp, 'RedHat' => ntpd },
ensure => running,
enable => true,
require => Augeas['/etc/ntp.conf']
}
}
Profile Example
class profiles::base::ntp {
$server = hiera('profiles::base::ntp::server')
class ::ntp {
ntp_server => $server
}
}
Hiera Example
# /etc/puppet/hiera.yaml
:backends: yaml
:yaml:
:datadir: /etc/puppet/hiera
:hierarchy:
- "node/%{::clientcert}"
- "environment/%{::env}"
- common
# /etc/puppet/hiera/common.yaml
profiles::base::ntp::server: "ins1.sg.internal"
Role Example
class roles::generic_server {
include profiles::base::ntp
include profiles::base::zabbix_agent
include profiles::security::firewall
}
Built-in Classifier Example
node default {
include roles::generic_server
}
Check this out
R10K - Puppet environment and module deployment:
https://github.com/puppetlabs/r10k
Doing the Refactor Dance:
https://puppetlabs.com/presentations/workshop-doing-refactor-dance-making-
your-puppet-modules-more-modular-gary-larizza
Gary’s Larizza blog:
http://garylarizza.com/
Thank you
presented by Alex Simenduev
- github.com/shamil
- linkedin.com/in/simenduev

Puppet DSL gotchas, and understandiing Roles & Profiles pattern