On Sun, Jun 27, 2010 at 12:48 AM, Al @ Lab42 <lab42...@gmail.com> wrote:
>
>
> On 27 Giu, 09:02, Douglas Garstang <doug.garst...@gmail.com> wrote:
>> I've been struggling with puppet variable scope all day, well, for
>> several months actually.
>>
>> I think I have pretty simple requirements. For any given node, I want
>> to be able to set a series of variables and include a set of classes,
>> based on three different aspects of a node, being physical location,
>> operating system, and function. If I try and do this with classes, I
>> find that variables set in a class included from a node, are not
>> visible to other classes included from that node.
>>
>> node 'node1.fr.xxx.com' {
>>   include facility::sjc
>>   include ldap::client
>>
>> }
>>
>> In this example, variables defined in facility::sjc are not visible in
>> ldap::client (in this case, it would be the IP address of the local
>> LDAP server).
>>
>> Another approach is to do everything with node inheritance, but in
>> order to model these three functions, you end up with nodes with names
>> like sjcDellBootServer or nycVmwareBootServer, which is just plain
>> stupid.
>
> Node names don't need to adapt to inheritance's logic.
> You can do something like:
> node sjc {
> ldap_server="10.10.10.10"
> }
>
> node 'node1.fr.xxx.com' inherits sjc {
>   include ldap::client
> }
>
> When using nodes' inheritance the only real thing you've to care about
> is to define variables BEFORE including any class.
> So at the end it's better to include classes only in the node that
> defines your host nad never in the "intermediary" nodes that can
> represent facilities, networks or whatever.
>
> On the other way, this also should work, if you want to define your
> variables in a class:
>
> class ldap::client {
>   include facility::sjc
>
>   do_something with "${facility::ldap_server}" in this class
>
> BUT if you need to use "${facility::ldap_server}" in a template you
> should reassing it to a local variable (dunno if the problem is the
> colon or whatever I just found the problem and made a quick fix with
> somehting like):
> $my_ldap_server="${facility::ldap_server}"
>
> and use $my_ldap_server in the template.
>
> }

Al,

thanks for the examples and such. Your using pretty simplistic
examples, and I'm sorta beyond that point. Everything you said makes
sense, and is true. Trying to do a more complex implementation falls
apart though due to puppet's scoping issues.

The problem with doing something with  "${facility::ldap_server}" is
that it should really be called  "${facility::sjc::ldap_server}", and
when you do that, you completely destroy the whole point of
inheritance. The ldap client module itself should not directly
reference the  "${facility::sjc::ldap_server}" variable, otherwise I
would see one ldap module for each facility!

Doug

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-us...@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