Thanks to everyone who kicked the tires on the experimental data in modules 
feature included in Puppet 3.3.0. We got a lot of feedback, some cool 
proof-of-concept modules, and a definitive conclusion to the experiment. 

The idea of including a module-specific hiera backend is centered around one 
primary use case: replacing the 'params class pattern', a common idiom in 
Puppet modules that's described in the [Using Parameterized 
Classes][param-classes] guide. The problem that most testers ran into though is 
that for non-trivial modules they ended up having to re-implement the Puppet 
DSL logic encoded in their params.pp in convoluted, non-obvious ways. The 
solutions to this led to more contortions until we'd ended up with the ability 
to execute parser functions in the right-hand-side of a yaml value. So 
something which started out trying to help separate data from code ended up 
putting code back into data!

Additionally, even after multiple attempts to simplify the surface area and 
user experience with the bindings system (described in ARM-9) that underlay the 
data-in-modules implementation, users still found its complexity daunting. 
There are some important bits of scaffolding (like an actual type system for 
Puppet!) that will prove valuable as more of the future parser and evaluator 
work that Henrik is building makes its way into the product, but in the final 
analysis the data in modules feature was the wrong vehicle to introduce them.

Refocusing on the problems users were trying to solve (and here I have to give 
shout-outs to Ashley Penney for his [puppetlabs-ntp][] branch and the dynamic 
duo of Spencer Krug/William van Hevelingen for their [startrek][] module) and 
the problems with the 'params' pattern lent some clarity. We've gotten into a 
situation of disparity with regard to hiera and data bindings, because data 
bindings enable module _users_ to use their site-wide hiera data but don't 
provide moduel _authors_ the same affordance. But rather than introduce 
additional complexity, we can close the gap for existing code patterns. 

So the proposed solution at this point is:
- enable an implicit data-binding lookup against the hiera-puppet backend for a 
value of 'classname::variable' in the file 
'modules/classname/manifests/params.pp', which simplifies class definition and 
provides consistency with other hiera backends. As a module author, you'd still 
leave your logic for variables in params.pp, but they'd be implicitly looked up 
via data bindings as the class is declared, after consulting site-wide hiera.
- remove the user-facing '--binder' functionality
- fix known problems with the hiera-puppet lookups ([Redmine 15746][15746], 
namely, but if there are others that are important to you please speak up!)

To show how this would work, I'll rework the ['smart parameter defaults' 
example][param-classes] I linked above, with my commentary behind `##` comments:

    # /etc/puppet/modules/webserver/manifests/params.pp
    
    class webserver::params {   ## nothing changes here...
     $packages = $operatingsystem ? {
       /(?i-mx:ubuntu|debian)/        => 'apache2',
       /(?i-mx:centos|fedora|redhat)/ => 'httpd',
     }
     $vhost_dir = $operatingsystem ? {
       /(?i-mx:ubuntu|debian)/        => '/etc/apache2/sites-enabled',
       /(?i-mx:centos|fedora|redhat)/ => '/etc/httpd/conf.d',
     }
    }
    
    # /etc/puppet/modules/webserver/manifests/init.pp
    
    class webserver(  ## inheritance is gone, and
     $packages,       ## data bindings look up the defaults
     $vhost_dir       ## as webserver::params::vhost_dir
    ) {
    
     package { $packages: ensure => present }
    
     file { 'vhost_dir':
       path   => $vhost_dir,
       ensure => directory,
       mode   => '0750',
       owner  => 'www-data',
       group  => 'root',
     }
    }

    # /etc/puppet/manifests/site.pp

    node default {
      class { 'webserver': }  ## no params needed, they're in hiera

    ## then in one of my site-wide hiera layers, I can override
    ## the value without modifying the module or class declaration

    # /etc/puppet/hieradata/snowflake.domain.com.yaml
    webserver::vhost_dir: '/some/other/dir'
 
This way the module author (who probably has the most work to do and needs the 
expressiveness of the DSL) can provide default data, but site administrators 
can still override it using mechanisms they're already using.

Note too that this is the next iteration, not necessarily the end state. It's 
super important to get this right because the whole community is going to have 
to live with it for a long time; those of you out here on the bleeding edge 
willing to risk some skin to make something awesome are critical to making that 
happen. 


Eric Sorenson - eric.soren...@puppetlabs.com - freenode #puppet: eric0 
puppet platform // coffee // techno // bicycles 


[puppetlabs-ntp]: https://github.com/apenney/puppetlabs-ntp/tree/data-in-modules
[startrek]: https://github.com/pro-puppet/puppet-module-startrek
[param-classes]: 
http://docs.puppetlabs.com/guides/parameterized_classes.html#appendix-smart-parameter-defaults
[15746]: https://projects.puppetlabs.com/issues/15746

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to puppet-users+unsubscr...@googlegroups.com.
To post to this group, send email to puppet-users@googlegroups.com.
Visit this group at http://groups.google.com/group/puppet-users.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to