Writing a papply script
We'd like to make it as quick and easy as possible to apply Puppet on a machine, so I usually write a little script that wraps the puppet apply
command with the parameters it needs. And to deploy the script where it's needed, what better tool than Puppet itself?
How to do it...
Follow these steps:
In your Puppet repo, create the directories needed for a
puppet
module:ubuntu@cookbook:~/puppet$ mkdir modules ubuntu@cookbook:~/puppet$ mkdir modules/puppet ubuntu@cookbook:~/puppet$ mkdir modules/puppet/manifests ubuntu@cookbook:~/puppet$ mkdir modules/puppet/files
Create the file
modules/puppet/files/papply.sh
with the following contents (change the path/home/ubuntu/puppet
to where your Puppet repo is located). Thesudo puppet apply
command should all be on one line:#!/bin/sh sudo puppet apply /home/ubuntu/puppet/manifests/site.pp --modulepath=/home/ubuntu/puppet/modules/ $*
Create the file
modules/puppet/manifests/init.pp
with the following contents:class puppet { file { '/usr/local/bin/papply': source => 'puppet:///modules/puppet/papply.sh', mode => '0755', } }
Modify your
manifests/nodes.pp
file as follows:node 'cookbook' { include puppet }
Apply your changes:
ubuntu@cookbook:~/puppet$ sudo puppet apply manifests/site.pp --modulepath=/home/ubuntu/puppet/modules Notice: /Stage[main]/Puppet/File[/usr/local/bin/papply] /ensure: defined content as '{md5} 171896840d39664c00909eb8cf47a53c' Notice: Finished catalog run in 0.07 seconds
Test that the script works:
ubuntu@cookbook:~/puppet$ papply Notice: Finished catalog run in 0.07 seconds
Now whenever you need to run Puppet, you can simply run papply
. In future, when we apply Puppet changes, I'll ask you to run papply
instead of the full puppet apply
command.
How it works...
As you've seen, to run Puppet on a machine and apply a specified manifest file, we use the puppet
apply
command:
puppet apply manifests/site.pp
When you're using modules (such as the puppet module we just created) you also need to tell Puppet where to search for modules, using the modulepath
argument:
puppet apply manifests/nodes.pp -- modulepath=/home/ubuntu/puppet/modules
In order to run Puppet with the root privileges it needs, we have to put sudo
before everything:
sudo puppet apply manifests/nodes.pp -- modulepath=/home/ubuntu/puppet/modules
Finally, any additional arguments passed to papply
will be passed through to Puppet itself, by adding the $*
parameter:
sudo puppet apply manifests/nodes.pp -- modulepath=/home/ubuntu/puppet/modules $*
That's a lot of typing, so putting this in a script makes sense. We've added a Puppet file
resource that will deploy the script to /usr/local/bin
and make it executable:
file { '/usr/local/bin/papply': source => 'puppet:///modules/puppet/papply.sh', mode => '0755', }
Finally, we include the puppet
module in our node declaration for cookbook
:
node 'cookbook' { include puppet }
You can do the same for any other nodes managed by Puppet.