Null / blank values on puppet facts

facterpuppet

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.

Best Answer

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