puppetlabs-stdlib/README_DEVELOPER.markdown
Jeff McCune a452f6a9af (#12357) Add puppet_vardir custom fact
Without this patch the PE modules don't have a way to identify a
filesystem path where it's OK to place variable data related to managing
the target node.  This is a problem when a module like pe_compliance
needs to write a wrapper script to the node's filesystem.

This patch addresses the problem by exposing the node's Puppet[:vardir]
setting as a Facter fact.

This fact value will be set to `nil` if Puppet is not loaded into
memory.  If Puppet is loaded, e.g. using `facter --puppet` or using
`puppet agent` or `puppet apply` then the fact will automatically set
the value to Puppet[:vardir]

The value of this setting is subject to Puppet's run_mode.

This patch implements a new utility method in the standard library
module named `Facter::Util::PuppetSettings.with_puppet`.  The method
accepts a block and will only invoke the block if the Puppet library is
loaded into the Ruby process.  If Puppet is not loaded, the method
always returns nil.  This makes it easy to define Facter facts that only
give values if Puppet is loaded in memory.
2012-03-05 16:26:22 -08:00

1.3 KiB

Puppet Specific Facts

Facter is meant to stand alone and apart from Puppet. However, Facter often runs inside Puppet and all custom facts included in the stdlib module will almost always be evaluated in the context of Puppet and Facter working together.

Still, we don't want to write custom facts that blow up in the users face if Puppet is not loaded in memory. This is often the case if the user run facter without also supplying the --puppet flag.

Ah! But Jeff, the custom fact won't be in the $LOAD_PATH unless the user supplies --facter! You might say...

Not (always) true I say! If the user happens to have a CWD of <modulepath>/stdlib/lib then the facts will automatically be evaluated and blow up.

In any event, it's pretty easy to write a fact that has no value if Puppet is not loaded. Simply do it like this:

Facter.add(:node_vardir) do
  setcode do
    # This will be nil if Puppet is not available.
    Facter::Util::PuppetSettings.with_puppet do
      Puppet[:vardir]
    end
  end
end

The Facter::Util::PuppetSettings.with_puppet method accepts a block and yields to it only if the Puppet library is loaded. If the Puppet library is not loaded, then the method silently returns nil which Facter interprets as an undefined fact value. The net effect is that the fact won't be set.