On Sun, Aug 12, 2012 at 2:43 PM, Eric Shamow <e...@puppetlabs.com> wrote:

> First off, it's important to distinguish import from include. They "feel"
> like similar concepts but they're not - import goes and physically loads a
> file. Include says "ensure that this class is part of this host's resource
> graph."
>
It is an import concept. It is very simple to think "include" in puppet ==
"include" in C. No, they are much different

>
> It's important not to think of Puppet in procedural, top-down terms. We
> haven't just said, "give me all the stuff in this class, and now do these
> things." Rather we are building a model of a server, and manifest code
> simply informs pieces of that model. So by saying "include <class>" you are
> really saying, "Puppet, if you haven't already, make sure this class is
> part of the overall resource graph."
>
> The better model for this example is, rather than a box inside of a box,
> you are looking at two sealed boxes sitting side by side. When you include
> the first group, it is added to the list of boxes used. Within the first
> box, when you then say "give me the second box," that second box is placed
> *alongside* the first. Thus in order to grab anything from it, you have to
> specify "I need the stuff from box 2."
>
> Does that analogy help a bit more?
>
> The reason for this is that, as your number of classes grows, so too will
> your variables. If they share a single global namespace, the likelihood of
> a global variable name being used more than once increases. This can lead
> to really unexpected changes and ambiguity in building the graph.
>
> An example: suppose is this module you say $puppetmaster =
> "myserver.local" and in another module, you want to only run on a puppet
> master and so say $puppetmaster = true. When Puppet assembles the model of
> your system, which of the two is to be applied where? Dynamic scoping tried
> to guess at this. The idea here is to say, eliminate ambiguity - tell us
> exactly which one you want.
>
> In fact, this is the best analogy.  But clearly it is easy for everyone to
make mistakes especially if you are following the examples of "Pro Puppet"
- incidentally, this book contains the same configuration discussed in this
thread that was valid for puppet 2.6 but it is not anymore for puppet 2.7

Best Regards

> -Eric
>
> --
>
> Eric Shamow
> Professional Services
> http://puppetlabs.com/
> ©631.871.6441
>
> Join us for PuppetConf 2012 at the Mission Bay Convention Center in San
> Francisco, California on September 27th and 28th --> http://bit.ly/pcsig12
>
>
> On Sunday, August 12, 2012 at 2:35 AM, Zachary Alex Stern wrote:
>
> > So, your explanation makes sense to me - but that doesn't exactly
> explain to me why the "include" statement isn't enough.
> >
> > E.g. when I'm "including the puppet::params class in the puppet::config
> class, what affect is it having at all, if not setting things like the
> variables included in the original puppet::params class?
> >
> > How can I change variables on the fly effectively, if I can't just do
> the import and then have the variable $puppetserver equal the one from the
> imported class? I'm having a hard time grasping what import does, if not
> this.
> >
> > On Saturday, August 11, 2012 10:36:48 PM UTC-4, Eric Shamow wrote:
> > > The best reference to explain how variable scoping works in Puppet is
> this one -
> > >
> > > http://docs.puppetlabs.com/guides/scope_and_puppet.html
> > >
> > > Scoping has changed with 2.7, so you may find some confusing
> references online that follow the pre-2.7 rules. In general the 2.7 changes
> are designed to introduce some sanity to variable scopes and eliminate
> dynamic scoping, which causes all kinds of pain.
> > >
> > > The easiest way to think about scoping in general is that a scope is
> defined by its container. If I put something physical in a box, I have
> access to it the moment I open the box, and other objects inside the box
> can interact with it. If, however, I now put that box inside a second box,
> the objects in the second box cannot interact directly with the objects in
> the first - the first object is protected by its container.
> > >
> > > Scoping mostly works the same way. The right way to get at the
> variable is to always explicitly scope, as you began to get at below with
> your scope.lookupvar example. As that can be a bit of a pain to repeat, you
> can always copy the value into a local variable:
> > >
> > > class puppet::config {
> > > include puppet::params
> > > $puppetserver = puppet::params::puppetserver
> > > …
> > > }
> > >
> > > -Eric
> > >
> > > --
> > >
> > > Eric Shamow
> > > Professional Services
> > > http://puppetlabs.com/
> > > ©631.871.6441
> > >
> > > Join us for PuppetConf 2012 at the Mission Bay Convention Center in
> San Francisco, California on September 27th and 28th -->
> http://bit.ly/pcsig12
> > >
> > >
> > > On Saturday, August 11, 2012 at 8:45 PM, Zachary Stern wrote:
> > >
> > > > I'm having a really hard time grasping how variables are scoped in
> > > > puppet (not really much of a programmer).
> > > >
> > > > I've got a manifest that looks like this:
> > > > ###
> > > > class puppet::config {
> > > > include puppet::params
> > > > file { '/etc/puppet/puppet.conf':
> > > > ensure => present,
> > > > content => template('puppet/puppet.conf.erb'),
> > > > owner => 'root',
> > > > group => 'admins',
> > > > require => Class['puppet::install'],
> > > > notify => Class['puppet::service'],
> > > > }
> > > > }
> > > > ###
> > > >
> > > >
> > > > I've then got a manifest like this, which has a class being included
> above:
> > > > ###
> > > > class puppet::params {
> > > > $puppetserver = 'command.enterawesome.com (
> http://command.enterawesome.com) (http://command.enterawesome.com)'
> > > > }
> > > > ###
> > > >
> > > > The template being used in the first class includes the variable
> > > > $puppetserver, but somehow, the include statement isn't enough for
> the
> > > > variable to be defined within the scope of the manifest/template
> > > > above.
> > > > What gives?
> > > > It works just fine if I include a statement like this in the erb
> file:
> > > > <%= scope.lookupvar('puppet::params::puppetserver') %>
> > > >
> > > > But I'd really like to understand scoping better. What is it I need
> to
> > > > do to just refer to the variable by name? Why isn't the include
> > > > statement enough? Isn't in including the puppet::params class inside
> > > > the puppet::config class, and therefore having the variable defined
> in
> > > > that context? Apparently not. But I don't understand why. I wan't to
> > > > end up at a point where the variable is in the proper scope, such
> that
> > > > I can just have a statement like <%= puppetserver %> inside of the
> > > > template I'm using.
> > > >
> > > > Thanks in advance!
> > > >
> > > > --
> > > > You received this message because you are subscribed to the Google
> Groups "Puppet Users" group.
> > > > To post to this group, send email to 
> > > > puppet...@googlegroups.com(javascript:) (mailto:
> puppet...@googlegroups.com (javascript:)).
> > > > To unsubscribe from this group, send email to
> puppet-users...@googlegroups.com (javascript:) (mailto:
> puppet-users+unsubscr...@googlegroups.com (javascript:)).
> > > > 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 view this discussion on the web visit
> https://groups.google.com/d/msg/puppet-users/-/LcHGaFjy9JkJ.
> > To post to this group, send email to puppet-users@googlegroups.com(mailto:
> puppet-users@googlegroups.com).
> > To unsubscribe from this group, send email to
> puppet-users+unsubscr...@googlegroups.com (mailto:
> puppet-users+unsubscr...@googlegroups.com).
> > 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 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.
>
>

-- 
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