Thanks for these - this is very helpful.
On Tue, Aug 2, 2011 at 1:26 AM, vagn scott <[email protected]> wrote:
> **
> prep for 2.8: default values and overrides
>
> I was very happy, some months ago,
> when I worked out how to separate
> configuration from code in puppet.
>
> The scheme even allowed for specialization.
>
> The style was something like this:
>
> cat 04_default.pp
> #! /usr/bin/puppet apply
>
> node default {
>
> class myfoo1 inherits foo::default {
> $foo_param1 = "something else" # call 1
> specialization
> $foo_param3 = "dull and dreary" # change the
> default
> foo { "call 1": }
> }
> include myfoo1
>
> class myfoo2 inherits foo::default {
> $foo_param2 = "anything else" # call 2
> specialization
> $foo_param3 = "dull and dreary" # change the
> default again!
> foo { "call 2": }
> }
> include myfoo2
>
>
> }
>
> class foo::default {
> $foo_param1 = "something"
> $foo_param2 = "anything"
> $foo_param3 = "dull"
> $foo_param4 = "duller"
> }
>
> define foo() {
> notice("foo_param1 = ${foo_param1}")
> notice("foo_param2 = ${foo_param2}")
> notice("foo_param3 = ${foo_param3}")
> notice("foo_param4 = ${foo_param4}")
> }
>
> and the output with 2.6.2:
>
> ./04_default.pp
> notice: Scope(Foo[call 1]): foo_param1 = something else
> notice: Scope(Foo[call 1]): foo_param2 = anything
> notice: Scope(Foo[call 1]): foo_param3 = dull and dreary
> notice: Scope(Foo[call 1]): foo_param4 = duller
> notice: Scope(Foo[call 2]): foo_param1 = something
> notice: Scope(Foo[call 2]): foo_param2 = anything else
> notice: Scope(Foo[call 2]): foo_param3 = dull and dreary
> notice: Scope(Foo[call 2]): foo_param4 = duller
>
>
> But, with 2.7.2rc2 it doesn't work.
>
> ./04_default.pp
> Could not parse for environment production: Classes, definitions,
> and nodes may only appear at toplevel or inside other classes
> at /u0/home/vagn/puppet-nika/patterns/04_default.pp:5 on node
> nika.agawamtech.com
>
> Even if I moved the classes out of the node the
> scheme would still fail in 2.8 and later because it
> relies on dynamic scoping.
>
> The following works in both 2.6.2 and 2.7.2.
> It is both a shorter and a cleaner
> expression of the idea.
>
> cat 05_default.pp
> #! /usr/bin/puppet apply
>
> node default {
>
> class { "foo::default": foo_param3 => "dull and dreary", }
> foo { "call 1": foo_param1 => "something else", }
> foo { "call 2": foo_param2 => "anything else", }
>
> }
>
> class foo::default (
> $foo_param3 = "dull",
> $foo_param4 = "duller"
> ) {
> # conditionals and composites would go here ...
> }
>
> define foo(
> $foo_param1 = "something",
> $foo_param2 = "anything"
> ) {
> notice("foo_param1 = ${foo_param1}")
> notice("foo_param2 = ${foo_param2}")
> notice("foo_param3 = ${foo::default::foo_param3}")
> notice("foo_param4 = ${foo::default::foo_param4}")
> }
>
> Note that foo::default MUST be instantiated for there to be
> any values for foo() to reference. Even if no overrides
> are provided you have to explicitly put
>
> class { "foo::default": } # required
>
> somewhere in your manifests.
>
> Three observations
> - most of the work is done in the argument lists
> - arguments can have defaults
> - we only have to express the specializations
>
> As always, comments and corrections welcome.
>
> --
> vagn
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/puppet-users?hl=en.
>
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en.