To get started with the example control repo install a puppet client and pull down the control repo.
The control-repo repository that accompanies these blog posts is published here: https://gitlab.com/benprescott-puppetapply/control-repo – so there’s a nice GUI for exploring what’s provided.
Couple of assumptions here; you’ll need to read the puppet docs if your situation doesn’t match.
- Open source client. I’m going to derive this from the open source install instructions – Puppet Enterprise distributes its clients from the master.
- 5.3 client; or instructions, anyway – the repo may provide a later version. Google returned the instructions for 5.3; at the time of writing, 5.4, 5.5, and 6.0 were out as well, or a 4.x client will work also.
What will you need?
- Centos 7. It’s what I have available to prove the instructions with. If you can get a puppet client onto whatever you have – Ubuntu, Fedora, etc. – then you should be ok from there.
- An installation you don’t mind being messed around with a little. My example code will make changes, but I’ll spell out what they are, and none will be intrusive, just cosmetic.
- Internet access.
- Root access. I specify running commands as sudo. If you’re on Centos 7, get your login account into the wheel group.
# check grep wheel /etc/group # if your account isn't listed .. su - # enter root password! useradd -a -G wheel myusername logout
Package repo and agent install
The package repository is needed first. (puppet platform docs)
Also, this ensures the git client is installed as well.
sudo rpm -Uvh https://yum.puppet.com/puppet5/puppet5-release-el-7.noarch.rpm
sudo yum install puppet-agent git
PATH
Puppet gets installed to /opt/puppetlabs, which isn’t in the PATH.
On Centos 7, /etc/profile.d/puppet-agent.sh is installed by the puppet package, and it amends PATH as needed, but it isn’t loaded by sudo.
After installing puppet-agent, you’ll need to start a new shell to update PATH.
control repo
Check out the sample control repo the I’ve put in Gitlab to accompany these blog posts. It doesn’t matter where you check this out; I’m assuming it’s in your home directory, the only place I wouldn’t put it is /tmp or /var/tmp as these get housekept.
git clone https://gitlab.com/benprescott-puppetapply/control-repo.git
Check what branch you’re on (should be ‘production’).
cd control-repo git status
For example:
$ git status # On branch production nothing to commit, working directory clean
Your working directory
From broadly this point onwards, I will assume your current working directory is the control-repo directory. You need to be there to run git commands, and in due course, there’s one or more scripts in there that you’ll be running regularly.
My posts will also refer to puppet manifests and yaml within the control-repo directory structure, and I will refer to them with relative path names that assume you’re sitting in the root of control-repo.
Create “local” environment
As noted in the first post, each logical step is presented as a branch. To get started, check out the first branch.
git checkout puppetapply01
To make puppet useful, we need to point it at some code to run. If you run puppet apply, it’ll sit and wait for you to type some code in (ctrl-c to get out.)
I run puppet apply along side puppet agent (to get instructions from a puppet master) so the approach I take is to use an environment to provide the puppet apply code. Puppet has this capability built in, and using environments becomes second nature if your systems are clients of a puppet master.
The control repo contains a script to link your working copy of control repo into root’s puppet environment directory under /etc
sudo scripts/createlocal.sh
Expect output like this; the first four lines come from the script, and then it uses puppet to create the link.
$ sudo scripts/createlocal.sh [sudo] password for user: ok: running as root ok: located control-repo in /home/ben/workspace/control-repo ok: found /opt/puppetlabs/bin/puppet ok: /etc/puppetlabs/code/environments exists Notice: Compiled catalog for clientname in environment production in 0.03 seconds Info: Applying configuration version '1547545272' Notice: /Stage[main]/Main/File[/etc/puppetlabs/code/environments/local]/ensure: created Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml Notice: Applied catalog in 0.04 seconds
And it did:
$ ls -ald /etc/puppetlabs/code/environments/local lrwxrwxrwx. 1 root root 32 Jan 15 09:41 /etc/puppetlabs/code/environments/local -> /home/ben/workspace/control-repo
puppet apply command line
The script provides an example of using puppet apply with the ‘code’ passed in the command line.
Built in, puppet can manage a bunch of stuff; get a list with
puppet resource --types
Here’s an example of puppet apply without lots of shell substitution.
Note:
- I’ve split the command over two rows so it’s not hidden on the blog post. The double quotes should cause the shell to expect the second line.
- This isn’t running via sudo, and it doesn’t need to. The default Centos 7 sudo behaviour doesn’t preserve PATH and doesn’t load profile.d, so sudo puppet errors with ‘command not found’.
cd /tmp mkdir foo touch bar puppet apply --test -e "file {'/tmp/foo/bar': ensure=>link,target=>'/tmp/bar',}"
Expect output like:
Notice: Compiled catalog for clientname in environment production in 0.03 seconds Info: Applying configuration version '1547545759' Notice: /Stage[main]/Main/File[/tmp/foo/bar]/ensure: created Info: Creating state file /home/ben/.puppetlabs/opt/puppet/cache/state/state.yaml Notice: Applied catalog in 0.36 seconds
Now tidy up.
puppet apply --test -e "file {['/tmp/foo/bar','/tmp/foo','/tmp/bar']: ensure=>absent,force=>true,}"
Expect output like:
Notice: Compiled catalog for clientname in environment production in 0.03 seconds Info: Applying configuration version '1547545890' Info: /Stage[main]/Main/File[/tmp/foo]: Recursively backing up to filebucket Info: Computing checksum on file /tmp/foo/bar Info: /Stage[main]/Main/File[/tmp/foo]: Filebucketed /tmp/foo/bar to puppet with sum d41d8cd98f00b204e9800998ecf8427e Notice: /Stage[main]/Main/File[/tmp/foo]/ensure: removed Info: Computing checksum on file /tmp/bar Info: /Stage[main]/Main/File[/tmp/bar]: Filebucketed /tmp/bar to puppet with sum d41d8cd98f00b204e9800998ecf8427e Notice: /Stage[main]/Main/File[/tmp/bar]/ensure: removed Notice: Applied catalog in 0.42 seconds
Note that the output refers to an environment called ‘production’. Use of environments really is baked into how puppet works.