Testing your Puppet code locally with Vagrant is great. Fast and clean development and testing of your code can be done in this comfortable way. The base setup is easy:
- Download and install Vagrant
- Download and install VirtualBox
- Download and install Puppet
So far, so good. When it comes to Hiera, I was struggling around with a setup that actually uses Hiera data. I couldn’t convince Vagrant to notice my Hiera configuration. And so none of my keys and values inside my YAML files found their way into my Puppet manifests. vagrant provision puppet_dev always failed with this error:
==> puppet_dev: Error: Could not find data item backuppc::key in any Hiera data file and no default supplied at /tmp/vagrant-puppet/modules-7de7a4fc15d45b89f16013b5dc73de0e/backuppc/manifests/init.pp:7 on node puppet-dev
Installation and configuration of Hiera seems to be very easy and straight forward. Everything starts with an hiera.yaml and one specialty with :datadir: Use two different hiera.yaml files for Vagrant and for real life Puppet provisioning on your servers. In Vagrant use a relative path to your hiera yaml files. In real life use a absolute path.
---
:backends:
- yaml
:logger: console
:yaml:
:datadir: hiera
:hierarchy:
- "%{::fqdn}"
- "%{::hostname}"
- common
Create a datadir and place a common.yaml file into it. My filesystem structure looks like this:
├── Gemfile ├── Rakefile ├── Vagrantfile ├── hiera │ └── common.yaml ├── hiera.yaml ├── manifests │ └── site.pp ├── modules │ ├── module1 │ ├── module2 │ └── vendor └── puppet.conf
All we need now is a proper Vagrantfile to make vagrant provision puppet_dev work. Vagrant’s Hiera documentation (scroll down to the bottom) tells us how to change the Vagrantfile. Unfortunately this is not the whole truth. After an extensive Google search, I found a working configuration which is as follows.
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.synced_folder "hiera", "/tmp/vagrant-puppet/hiera"
config.vm.provision :puppet, :options => ["--yamldir /hiera"] do |puppet|
puppet.manifests_path = "manifests"
puppet.manifest_file = "site.pp"
puppet.module_path = ["modules", "modules/vendor"]
puppet.hiera_config_path = "hiera.yaml"
puppet.working_directory = "/tmp/vagrant-puppet"
end
config.vm.provider :virtualbox do |vb|
vb.customize [
"modifyvm", :id,
"--memory", "512",
]
end
config.vm.define :puppet_dev do |box|
box.vm.network :private_network, ip: '192.168.90.10'
box.vm.hostname = "puppet-dev"
end
end
The interesting part lies in lines 3 and 5. Sync your Hiera datadir to Vagrant’s temporary directory so everything is on the spot and tell the Puppet provisioner explicitly to use a yamldir.
As a side note, I needed to quote an absolute path to :datadir: inside hiera.yaml. Otherwise my puppetmaster and by association my puppet agent (client) ignored my Hiera data as well.