On Wednesday, September 16, 2015 at 10:11:16 PM UTC-5, Corey Osman wrote:
>
> Is it considered bad practice to make use of a custom provider code to 
> retrieve values for a fact? 
>
> example: 
>
> Facter.add("bmc_ip", :timeout => 2) do 
>   confine :bmc_device_present => [:true, true] 
>   confine :bmc_tools_present => [:true, true] 
>   setcode do 
>     
> Puppet::Type.type(:bmc).instances.first.retrieve_resource.to_data_hash["parameters"][:ip]
>  
>
>   end 
> end 
>
> Since the fact and provider code overlap each other with what it gathers I 
> was looking for a tool-agnostic way 
> to retrieve some values from the BMC device.  What I like about this is 
> that the fact uses puppet to figure out 
> how to retrieve the data without making the user choose a specific tool 
> for fact values. 
>
>
>
> Corey 
>


Considering the order of the Puppet agent run I would expect, having a 
provider start up during fact collection to create a fact would be 
surprising behavior to me.

I usually architect types and facts the other way around.  So I am 
interested in the community opinion on this.

If I'm writing a native provider that has some useful fact-like data then I 
write a fact and use that in the creation of the provider.    This ensures 
I'm not duplicating logic all over the code base.  

Some providers need a key fact to do much of their work. Facter can cache 
that at the start of the run instead of recalculating it or duplicating the 
logic in many providers.  Plus the fact can be confined to systems where 
the providers may not run.

However, my facts tend to be encapsulated in a sub-module of Facter::Util 
and not simple execs.  This enables  organized construction of complex 
facts while the actual Facter.add block remains trivial.  The module-based 
fact can be unit tested with puppet-rspec function matchers.  

Care has to be taken at that level of programming.  If the Facter fact 
module is imported to use the module directly instead of using the 
Facter.value call the fact will run multiple times.  But the ordering of 
plugin-sync and fact collection before resource evaluation ensures the fact 
has already run or failed before the native type needs it.

If the goal is a tool agnostic approach then this is just forcing some 
provider in Puppet to pick a tool for you.  If the fact didn't work you 
could write your own provider to pick a tool if needed.  So there is that 
advantage to a provider-based fact in place of a fact-based provider.

Jeremiah

 

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-dev/71cc46cb-251e-402d-b748-f0be8dc530db%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to