You may want to set custom puppet facts in your development environment by specifying them in your Vagrantfile, so you can have a unique fact per developer or identify your own environment. Here’s a quick way to do that.
First: make sure you are running the latest version of facter (yum update facter), it should be at least version 1.7 as it supports custom facts easily (check with ‘facter –version’).
$ facter --version 1.7.1
Now, before the Vagrantfile changes, your facter facts will look like this. The solution is within the :shell provider, in the first few lines of the Vagrantfile.
$ facter | grep 'custom' [empty]
Your Vagrantfile can now be modified to look like this, to set up custom facts.
Vagrant::Config.run do |config| # First: run a shell provisioner to set up the custom facts config.vm.provision :shell do |shell| shell_cmd = "" # Make sure the facts directory exists shell_cmd << "mkdir -p /etc/facter/facts.d/; " # Add as much of these lins for any custom fact you want shell_cmd << "echo 'custom_fact1=the value of the fact' > /etc/facter/facts.d/custom_fact1.txt; " # Run the inline shell to create those facts shell.inline = "#{shell_cmd}" end # Then: run puppet like you normally would config.vm.provision :puppet do |puppet| puppet.manifests_path = "manifests" puppet.manifest_file = "my_manifest.pp" end end
After a ‘vagrant provision’, your facts will be updated.
$ facter | grep custom custom_fact1=the value of the fact
And you can now use the $::custom_fact1 variable within your manifests/modules.
Update 16/5: as Dieter De Meyer pointed out, there’s a more elegant solution using the puppet provider itself. The downside is the facts are only available if you use ‘vagrant provision’ to start a Puppet run, if you use Puppet from within the virtual machine, these facts won’t be present (see the Vagrant Helper Scripts for Puppet to speed up your Puppet deployments).
Vagrant::Config.run do |config| config.vm.define :test do |vmconfig| vmconfig.vm.provision :puppet do |puppet| puppet.manifests_path = "manifests" puppet.manifest_file = "test.pp" puppet.module_path = [ "../", "./modules" ] puppet.facter = { "custom_fact1" => "value1", "custom_fact2" => "value2" } puppet.options = "--verbose" end end end
Thanks!