1

How can I quickly and easily state that a null / blank value is OK on a fact within puppet?

When assembling a custom fact I'm doing something like the following:

/puppet/production/modules/hosts/lib/facter

Facter.add(:hostslocal) do
  setcode do
    Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
  end
end

This works perfectly except if the file doesn't exist, in which case it will blow up with something like the following when used in Puppet.

Detail: Could not find value for 'hostslocal'

I've been able to work around it with something akin to 'if file not exists write a line that contains only a comment' but that seems kludgy.

1

Facter has lots of facts that only set under certain circumstances. Before using them you should check if they are undefined.

if $::hostslocal != undef {
  do_your_thing_here
}

If you really want your custom fact to always have a value, you can do something like

Facter.add(:hostslocal) do
  setcode do
    if File.exist? "/etc/hosts.local"
      Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
    else
      "unknown"
    end
  end
end
1

You have the power of Ruby at your disposal when writing such custom facts. So just check if the file in question even exists before doing the exec action. Something like:

Facter.add(:hostslocal) do
  setcode do
    if File.exist? "/etc/hosts.local"
      Facter::Util::Resolution.exec("cat /etc/hosts.local 2> /dev/null")
    end
  end
end

Untested of course, but that should be the direction in which you want to go. Have a look at http://docs.puppetlabs.com/guides/custom_facts.html for further details about custom facts.

  • I tried that. It still comes back with the same error response. – Tim Brigham Nov 22 '13 at 21:11
  • Maybe try putting the conditional outside of the setcode block? – daff Nov 22 '13 at 21:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.