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.

Tim Brigham
  • 15,545
  • 10
  • 75
  • 115

2 Answers2

2

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
sciurus
  • 12,678
  • 2
  • 31
  • 49
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 the official documentation for further details about custom facts.

рüффп
  • 620
  • 1
  • 11
  • 25
daff
  • 4,809
  • 2
  • 28
  • 27