I’m a huge fan of Vagrant, it allows me to quickly test applications and proposed architectures with minimal fuss and, with a provisioner, in a way that’s reproducible for myself and others.
Vagrant supports many provisioners, but I tend to stick with shell and Puppet. Shell provides a nice quick way of hacking together something that Just Works™, but it’s hard to get shell to be robust and idempotent which is why I prefer Puppet.
Sadly Vagrant doesn’t provide a way to supply an inline manifest like it does with the shell provisioner. This means that for simple environments you have to create/specify a location for the manifest file or have it within the root of the project.
If you’re looking for a quick way to get a simple inline Puppet manifest in Vagrant, here’s a simple (albeit Fugly) way to do this.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$manifest = <<PUPPET
Exec {
path => ['/usr/bin', '/bin', '/usr/sbin', '/sbin', '/usr/local/bin', '/usr/local/sbin']
}
exec { 'apt-get update':
command => 'apt-get -qq -y update --fix-missing',
unless => 'grep -F `date +"%y-%m-%d"` /var/log/apt/history.log'
}
package { 'build-essential':
ensure => present,
name => 'build-essential',
require => Exec['apt-get update']
}
PUPPET
def inline_puppet(manifest)
require 'base64'
"TMPFILE=$(mktemp); echo '#{Base64.strict_encode64(manifest)}' | base64 --decode > $TMPFILE; puppet apply -v $TMPFILE"
end
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.provision :shell, :inline => inline_puppet($manifest)
end
Let me walk you though what happens.
We create a variable in the Vagrantfile to hold the Puppet manifest, and then define a function called inline_puppet
, we then use this function to create a shell command that:-
$manifest
using the Base64 module in Ruby so we don’t have to worry about escaping it for the shellbase64
to decode the encoded manifestmktemp
, within the Vagrant boxWe then use the built-in inline shell functionality of Vagrant to execute this shell command.
It’s not great, but it’s a simple way to have a standalone Vagrantfile with Puppet functionality.