Installing a package before starting a service
To show how ordering works, we'll create a manifest that installs httpd
and then ensures the httpd
package service is running.
How to do it...
- We start by creating a manifest that defines the service:
service {'httpd': ensure => running, require => Package['httpd'], }
- The service definition references a package resource named
httpd
; we now need to define that resource:package {'httpd': ensure => 'installed', }
How it works...
In this example, the package will be installed before the service is started. Using require
within the definition of the httpd
service ensures that the package is installed first, regardless of the order within the manifest file.
Capitalization
Capitalization is important in Puppet. In our previous example, we created a package named httpd
. If we wanted to refer to this package later, we would capitalize its type (package
) as follows:
Package['httpd']
To refer to a class, for example, the something::somewhere
class, which has already been included/defined in your manifest, you can reference it with the full path as follows:
Class['something::somewhere']
When you have a defined type, for example the following defined type:
example::thing {'one':}
The preceding resource may be referenced later as follows:
Example::Thing['one']
Knowing how to reference previously defined resources is necessary for the next section on metaparameters and ordering.
Learning metaparameters and ordering
All the manifests that will be used to define a node are compiled into a catalog. A catalog is the code that will be applied to configure a node. It is important to remember that manifests are not applied to nodes sequentially. There is no inherent order to the application of manifests. With this in mind, in the previous httpd
example, what if we wanted to ensure that the httpd
process started after the httpd
package was installed?
We couldn't rely on the httpd
service coming after the httpd
package in the manifests. What we have to do is use metaparameters to tell Puppet the order in which we want resources applied to the node. Metaparameters are parameters that can be applied to any resource and are not specific to any one resource type. They are used for catalog compilation and as hints to Puppet but not to define anything about the resource to which they are attached. When dealing with ordering, there are four metaparameters used:
before
require
notify
subscribe
The before
and require
metaparameters specify a direct ordering; notify
implies before
and subscribe
implies require
. The notify
metaparameter is only applicable to services; what notify does is tell a service to restart after the notifying resource has been applied to the node (this is most often a package or file resource). In the case of files, once the file is created on the node, a notify parameter will restart any services mentioned. The subscribe
metaparameter has the same effect but is defined on the service; the service will subscribe to the file.
Trifecta
The relationship between package and service previously mentioned is an important and powerful paradigm of Puppet. Adding one more resource-type file into the fold, creates what puppeteers refer to as the trifecta. Almost all system administration tasks revolve around these three resource types. As a system administrator, you install a package, configure the package with files, and then start the service.
Idempotency
A key concept of Puppet is that the state of the system when a catalog is applied to a node cannot affect the outcome of Puppet run. In other words, at the end of Puppet run (if the run was successful), the system will be in a known state and any further application of the catalog will result in a system that is in the same state. This property of Puppet is known as idempotency. Idempotency is the property that no matter how many times you do something, it remains in the same state as the first time you did it. For instance, if you had a light switch and you gave the instruction to turn it on, the light would turn on. If you gave the instruction again, the light would remain on.