On Wednesday, April 30, 2014 1:31:03 PM UTC-5, drs wrote:
>
> I am new to puppet and am trying to figure out variable scoping. I have a 
> test module that I am using for this and it looks like this:
>
> manifiests/init.pp:
>
> class test {
>   include test::params
>
>   file { 'testfile' :
>     path   => "/tmp/testfile",
>     content => template("test/testfile.erb"),
>   }
> }
>
> manifests/params.pp:
>
> class test::params {
>   $p1 = hiera('param1')
>   $p2 = hiera('param2')
> }
>
> templates/testfile.erb:
>
> this is the first parameter:  <%= @p1 %>
> this is the second parameter:  <%= @p2 %>
>
> global.yaml:
>
> ---
>   param1: "this is the first one"
>   param2: "this is the second one"
>
> Based on what I am seeing in the ProPuppet book (the discussion of the 
> puppet module in Chap. 2, pp69-70), this should work. However, the values 
> are not being inserted in the template. In order to get them in, I have to 
> add something like this to the init.pp manifest:
>
>   $a = $::test::params::p1
>   $b = $::test::params::p2
>
> and reference @a and @b in the template.
>
> So the question is: Am I missing something or is there an error in the 
> ProPuppet example?
>


I am not looking at *Pro Puppet*, but probably you are missing something: 
templates can refer directly to only global variables and the local 
variables of the class where the template is evaluated.  When one class 
declares another, such as via 'include', the other class's variables do not 
become local to the including class (see also below).  For a template to 
reference variables of some other class than the one currently evaluating 
it, it must use scope.lookupvar('qualified::name::of::desired::variable').

Note 1: Although declaring another class does not make its variables local, 
inheriting from another class does effectively do so.  But use class 
inheritance for that purpose.

Note 2: Do not misunderstand the 'include' function.  It "includes" the 
named class in the target node's catalog.  It does *not* include or 
interpolate the class or any part of it into the class where the 'include' 
statement appears.

 

>
> If I need to add the $a = …. and $b=… lines to the init.pp, what, if any 
> is the advantage to having a params.pp manifest. I could just put the 
> hiera() calls in init.pp.
>
>

The common understanding of the purpose of ::params class is to serve as a 
data repository, typically of hard-coded, module-specific data.  Such data 
most often serve as default values for class variables, including class 
parameters, and sometimes serve as general well-known values of the 
module's domain.  (To safely use a ::params class for parameter defaults, 
the parameterized class must inherit from the ::params class.) There has 
also been a growing tendency to put default data computations into such a 
class, though there is some doubt about the wisdom of that approach.

And you can indeed just put hiera() calls into one of your module's other 
classes instead, or allow puppet to make such calls automatically to select 
class parameter values.  For data ultimately coming from hiera, that's 
precisely what I would do.


John

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/4a5b685a-fd46-46fb-bfba-1cc3cf227463%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to