This has been a great discussion, thanks everyone for participating.  I 
think we're at a point where we've come to an agreement so here's the 
summary I'd like to post to the redmine ticket.

----
Capturing a discussion from the mailing list on this topic.  There were 3 
questions discussed about the implementation of this feature, see the 
details below.

*Question 1: *What is the justification for this feature?  Why is it needed?
Right now if a person is using an external fact that is fully puppet 
controlled they are creating a file resource in Puppet to get it to the 
client.  This means the fact won't actually be available during the catalog 
compile until the 2nd Puppet run.  It usually causes errors in the 1st 
Puppet run or undesired behavior around the portion of code that requires 
that fact.  This is a clumsy implementation.

Many people using Puppet are sysadmins who all are very familiar with 
shell, probably some python and perl in there too.  Ruby is not as common 
of a language in the sysadmin tool box.  Allowing users to write facts in a 
language they already know brings Puppet one step closer to a level people 
already understand which increases the adoption rate.

*Question 2: *Where will the external facts reside in the module path?
The external facts will reside in a facts/ directory at the base of the 
module. So an example tree would be:

mymodule
├── facts
│   └── my_external_fact.sh
├── lib
│   └── facter
│       └── custom_ruby_fact.rb
└── manifests
    └── init.pp


*Question 3:* Will there be a way to confine which facts are synchronized 
to what hosts for compatibility reasons?
Several suggestions were made and discussed at length.

1. Sync all facts to all clients and fail silently if a fact could not be 
evaluated
2. Have a folder structure based on kernel type that would sync facts to 
hosts with kernels matching the directory name
3. Have an optional ".confine" file for each fact that uses s-exrpessions 
to define a list of conditions that would have to be met for the fact to be 
synchronized.  The conditions would be based on other already existing facts
4. Take a simplified approach to number 3 and have the confine only 
evaluate equality of values for existing facts.  So "osfamily: RedHat" 
would be allowed, but no regex or && or || operators.
5. Adjust Facter to not execute files with extensions [exe, com, bat] on 
unix systems (Currently these are the only extensions executed on 
Windows).   Sync all facts to all systems.  Cross platform compatibilty is 
up to the programmer of the fact to fail silently if need be by returning 
nil or perform different operations depending on the OS it is being run on.

The discussion concluded that 1 was too passive, 2-4 were too complex, so 5 
was the best option.

The full details of the conversation can be found here:
https://groups.google.com/forum/#!topic/puppet-dev/jKgqWO0y4H0

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-dev.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to