Opened as http://projects.reductivelabs.com/issues/2140.


On Apr 6, 2009, at 2:37 PM, Paul Lathrop wrote:

>
> +1, this idea is doused in awesome sauce.
>
> On Mon, Mar 30, 2009 at 7:38 PM, Luke Kanies <l...@madstop.com> wrote:
>> Hi all,
>>
>> We at Reductive Labs keep running into clients who need something  
>> like
>> an attribute class - that is, for a given module, they want a single
>> class that handles all of the variable setting and overriding, and
>> then they want that attribute class to be merged into all or some of
>> the classes in the module.  (Teyo has especially been pushing me to
>> solve this problem.)
>>
>> This looks a lot like composition, which Puppet doesn't currently
>> support - you include one class's behaviour in another, rather than
>> inheriting.  This lack of composition is, I think, partially why
>> people keep trying to do variable inheritance and getting frustrated
>> that it doesn't work well.
>>
>> While doing a code audit for a client this week, though, I found  
>> their
>> solution to this problem to be close enough that I was able to take  
>> it
>> almost the rest of the of way.  They had what amounts to a 'data'
>> module with a class for each class that needed external data, and  
>> then
>> they defined all of the attributes in that data class.  That is, if
>> you have an 'apache' class, you'd also have a 'data::apache' class
>> with a bunch of attributes.  Then all of your usage of those
>> attributes would say '$data::apache::variable'.
>>
>> The big benefit of this model for them is that it allows clean change
>> control of all of the important configuration data (as opposed to
>> manifest structure and resources), and, again, it looks a lot like
>> composition.  In their case, they branch this module for all of their
>> environments, but none of the other modules.
>>
>> As soon as I saw it, though, I thought of a way that might make it
>> better, so I wrote a function that enables that way (and a converter
>> for their existing data).
>>
>> Basically, I created (and have attached) a simple function that knows
>> how to find and load a yaml file from a data directory, and it loads
>> that file as a hash of parameters that should be set as local
>> variables in the class.
>>
>> For instance, say you have this class apache; you'd create this file:
>>
>> data/apache.yaml
>>
>> And put all of the attributes you care about in that file.
>>
>> Then, in your apache class, you'd say:
>>
>> class apache {
>>   load_data()
>>   ...
>> }
>>
>> It would pick the right file based on the class name (although the
>> current function allows you to specify the class, also), load it, and
>> set all of the contained attributes as local variables in the class.
>> So, if your apache.yaml file looks like this:
>>
>> ---
>> host: myhost.com
>> port: 80
>>
>> Then this 'load_data' call is equivalent to this Puppet code:
>>
>> class apache {
>>   $host = "myhost.com"
>>   $port = 80
>> }
>>
>> The function is currently set up to support one big 'data' directory
>> for all of your modules.  One could argue that it should instead
>> support a data file per module, but the benefit of this one big data
>> directory is that it makes it *much* easier to write sharable modules
>> - you extract all of your site-specific data into this data dir, and
>> you share the module with essentially no site data.  It's probably
>> most reasonable to support an in-module data file and a site-wide  
>> data
>> directory to make it easy to provide defaults.
>>
>> I'm beginning to think that this, or a function a lot like this,
>> should be included directly into Puppet, and data should get loaded
>> automatically, rather than requiring the call to the 'load_data'
>> function.
>>
>> What do you think?
>>
>> --
>> Fallacies do not cease to be fallacies because they become fashions.
>>     --G. K. Chesterton
>> ---------------------------------------------------------------------
>> Luke Kanies | http://reductivelabs.com | http://madstop.com
>>
>>>
>>
>
> >


-- 
A government big enough to give you everything you want is big enough
to take from you everything you have. --Gerald R. Ford
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to