If other people need to read or maintain your manifests, or if you want to share code with the community, it's a good idea to follow the existing style conventions as closely as possible. These govern such aspects of your code as layout, spacing, quoting, alignment, and variable references, and the official puppetlabs recommendations on style are available at https://puppet.com/docs/puppet/latest/style_guide.html.
Using community Puppet style
How to do it...
In this section, I'll show you a few of the more important examples and how to make sure that your code is style compliant.
Indentation
Indent your manifests using two spaces (not tabs), as follows:
service {'httpd':
ensure => 'running',
}
Quoting
Always quote your resource names, as follows:
package { 'exim4': }
We cannot do this though:
package { exim4: }
Use single quotes for all strings, except when:
- The string contains variable references, such as ${::fqdn}
- The string contains character escape sequences, such as \n
Consider the following code:
file { '/etc/motd':
content => "Welcome to ${::fqdn}\n"
}
Puppet doesn't process variable references or escape sequences unless they're inside double quotes.
Always quote parameter values that are not reserved words in Puppet. For example, the following values are not reserved words:
name => 'Nucky Thompson',
mode => '0700',
owner => 'deploy',
However, these values are reserved words and therefore not quoted:
ensure => installed,
enable => true,
ensure => running,
false
There is only one thing in Puppet that is false, that is, the word false without any quotes. The string false evaluates to true and the string true also evaluates to true. Actually, everything besides the literal false evaluates to true (when treated as a Boolean):
if "false" {
notify { 'True': }
}
if 'false' {
notify { 'Also true': }
}
if false {
notify { 'Not true': }
}
When this code is run through puppet apply, the first two notifies are triggered. The final notify is not triggered; it is the only one that evaluates to false.
Variables
Always include curly braces {} around variable names when referring to them in strings, for example, as follows:
source => "puppet:///modules/webserver/${brand}.conf",
Otherwise, the Puppet parser has to guess which characters should be a part of the variable name and which belong to the surrounding string. Curly braces make it explicit.
Parameters
Always end lines that declare parameters with a comma, even if it is the last parameter:
service { 'memcached':
ensure => running,
enable => true,
}
This is allowed by Puppet, and makes it easier if you want to add parameters later, or reorder the existing parameters.
When declaring a resource with a single parameter, make the declaration all on one line and with no trailing comma, as shown in the following snippet:
package { 'puppet':
ensure => installed
}
Where there is more than one parameter, give each parameter its own line:
package { 'rake':
ensure => installed,
provider => gem,
require => Package['rubygems'],
}
To make the code easier to read, line up the parameter arrows in line with the longest parameter, as follows:
file { "/var/www/${app}/shared/config/rvmrc":
owner => 'deploy',
group => 'deploy',
content => template('rails/rvmrc.erb'),
require => File["/var/www/${app}/shared/config"],
}
The arrows should be aligned per resource, but not across the whole file, otherwise it may be difficult for you to cut and paste code from one file to another.
Symlinks
When declaring file resources that are symlinks, use the ensure => link and set the target attribute, as follows:
file { '/etc/php5/cli/php.ini':
ensure => link,
target => '/etc/php.ini',
}