Hi,

Le 19/09/2014 17:36, jcbollinger a écrit :

> The main points I am trying to get across

And I thnink that you have succeeded now. ;)

> are these:
> 
>    1. References to *non-local* variables should always be performed via 
>    qualified names, even when class inheritance makes the variable in 
> question 
>    accessible also via its unqualified name.
>    2. All qualified names used should accurately reflect the location of 
>    the referenced entity's declaration (some variables have multiple, 
> distinct 
>    qualified names).
>    3. If a class or defined type refers to a variable belonging to a 
>    different class then it should ensure via 'include' / 'require' / 
> 'contain' 
>    or via class inheritance that the variable is initialized first.

It's very clear. Thanks.

> I am not saying that references to variables declared *locally* should use 
> qualified names, but if you want to adopt that practice then it's fine.
> 
> With respect to other classes' variables, though, I seem not to be 
> successfully communicating point (2). 

Now I have understood the 3 rules.

>> I use $::test::xxx in class::internal not $::test::params::xxx 
>> because when xxx is "var1" or "var2", I want to have the value of 
>> var1 and var2 given as parameters of the test class (I don't want 
>> the default value of var1 and var2). 
>>
> 
> 
> Yes, that's fine for var1 and var2, but not for foo1 and foo2 which are not 
> declared by class test.  I don't see any particular purpose for foo1 and 
> foo2 to live in test::params anyway, however, if they are not to be used as 
> class parameter defaults.  You could as easily put them directly in class 
> test, and then continue to refer to them as you are now doing.

Yes, it's good idea.
Finally, as regards your comments, I think follow this pattern where I follow
your 3 rules, it seems ;):

-----------------------------------------------------
# Example of declaration for the "test" class.
class { test:
  var1 => 'specific_var1',
}

#### test module with its classes ####

class test::params {

  # API of the module with the default values.
  $var1 = 'default_var1'
  $var2 = 'default_var2'

}

# The *main* class of the module
class test (
  $var1 = $::test::params::var1,
  $var2 = $::test::params::var2,
) inherits test::params {

  # Shared variables in all classes of the module.
  $foo1 = 'value_foo1'
  $foo2 = 'value_foo2'

  include ::test::internal

  # Here, I could use $var1, $var2, $foo1, $foo2
  # (only in the main class of the module).
  notify { 'v1': message => "var1 = $::test::var1", }
  notify { 'v2': message => "var2 = $::test::var2", }
  notify { 'f1': message => "foo1 = $::test::foo1", }
  notify { 'f2': message => "foo2 = $::test::foo2", }

  # etc.

}

class test::internal {

  # It's an internal class of the module test which will be
  # never called by the "user". So, the line below is useless.
  # It's just for self-documenting.
  # Maybe I could remove this line, I don't know...
  require ::test

  notify { 'iv1': message => "Internal var1 = $::test::var1", }
  notify { 'iv2': message => "Internal var2 = $::test::var2", }
  notify { 'if1': message => "Internal foo1 = $::test::foo1", }
  notify { 'if2': message => "Internal foo2 = $::test::foo2", }

  # So, in templates, I use the syntax scope['::test::var']
  file { '/tmp/internal.txt':
    content => inline_template("var1=<%= scope['::test::var1'] %>\nfoo2=<%= 
scope['::test::foo2'] %>\n"),
  }
}
-----------------------------------------------------

> By the way, don't be confused about the meaning of the 'include' statement, 
> or its siblings 'require' and 'contain'.  'Include' says that the named 
> class must be included *in the catalog*; it does NOT interpolate the named 
> class's body in place of the include statement (i.e. it is not analogous to 
> a C preprocessor #include directive).  A given class can be the subject of 
> any number of 'include', 'require', and 'contain' statements; no class will 
> appear in the catalog more than once.

Yes, it's clear and even clearer with your link below.

> In part, it looks like you are running into bug 1220 
> <https://tickets.puppetlabs.com/browse/PUP-1220>.  

Yes, this is exactly my problem!

> That was reported fixed 
> in Puppet 3.5.0, but if I understand correctly, you need to enable the 
> future parser to actually activate the bug fix (which would make the 
> variable reference in your template fail to resolve in both cases).

I confirm. If I put:

    parser = future 

in the puppet.conf (in [main] section), I have the expected behaviour.
To my mind, the execpted behaviour (explained in the puppet documentation)
occurs with "parser = future" which is *not* enabled by default.
It's curious, but not a problem for me. I guess it's a backward
compatibility problem...

>> And in this case, I don't understand. I thought that : 
>>
>>   $var1 = "value_var1"       # LINE A 
>>   include ::test::internal   # LINE B 
>>
>> and 
>>
>>   include ::test::internal   # LINE B 
>>   $var1 = "value_var1"       # LINE A 
>>
>> was completely equivalent. Am I wrong? 
>>
>>
> 
> Yes, you are wrong, but the reason is a bit subtle.  For a comprehensive 
> explanation, see 
> http://puppet-on-the-edge.blogspot.com/2014/04/getting-your-puppet-ducks-in-row.html

Thanks for this link which I read and read again. Very interesting.
This link has helped me to understand a lot of things in Puppet.
For intance, it's too simple to say "puppet is declarative".
No, this is not exact. There a phase, the evaluation of manifests
and the building of the catalog where puppet is deeply imperative.
Very interesting...

> both at the same time.  You really ought to consider externalizing your 
> data and accessing via Hiera.  

I will ;) ... but not in module, only in "profiles" as explained in the
link below:

http://garylarizza.com/blog/2014/02/17/puppet-workflow-part-2/

I don't want Hiera lookups in modules but only in profiles.

I have really learned a lot of things in this thread. Sincerely
thank you for all your long and detailed explanations. Although
I have cut lot of quotes of your messages, I have really read
everything very carefully.

Thank you again for your help. :)

François Lafont

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/5420017E.1080208%40gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to