On Friday, November 22, 2013 1:18:25 PM UTC-6, Stuart Cracraft wrote:
>
> So now my puppet agent is getting this error in messages:
>
>   Date/Timestamp hostname[pid]: Must pass user to Class[abc::def] at 
> /etc/puppet/manifests/templates.pp:2 on node hostname
>
> The templates looks like this:
>
> class baseclass {
>   include abc::def
> }
>
> node default { 
>   include baseclass
> }
>
>
> So the question is, how is a variable "user" passed to Class[abc::def] in 
> templates.pp?
>
> I thought that I did it in nodes.pp with:
>
>   node 'hostname' inherits basenode {
>      class { 'abc::def':
>          user => "xxx"
>      }
> }
>
> but obviously not.
>
>

Since the error refers to file templates.pp rather than nodes.pp, I'm 
guessing that your class baseclass is getting evaluated before node 
'hostname's node block.  You don't show enough for me to be certain that's 
happening, but I suppose you also have something like

node basenode {
  include baseclass
}

Node 'hostname' inherits from node basenode, so node basenode's node block 
is evaluated first, causing class 'baseclass' to be evaluated, which 
declares class abc::def without specifying a 'user' parameter.

Let me just say at this point that I would advise you to avoid node 
inheritance, or at most to use it sparingly.  See 
http://docs.puppetlabs.com/puppet/3/reference/lang_node_definitions.html#inheritance.
  
If you must use node inheritance, then keep these things in mind:

   - Each applicable node block is evaluated independently and therefore 
   must stand on its own, except inasmuch as a child node can rely on its 
   parent to be evaluated first.  Inheritance is basically a chaining 
   mechanism.
   - In particular, node inheritance is not a mechanism for overriding 
   declarations in the base node.  It especially does not provide for 
   overriding variable declarations in the parent node's scope, though you can 
   shadow them by declaring a new variable of the same name in the child 
   node.  Doing so is highly inadvisable and unlikely to achieve what you want.
   - Deep node inheritance trees are likely to get you into trouble.
   - Class inheritance plays reasonably well with node inheritance when you 
   want to perform some sort of overriding, but class inheritance for the 
   purpose of overriding resources is out of favor.  That's odd, really, 
   because resource overrides are an essential part of the intended use for 
   class inheritance.  Now, the only use that's in favor involves the 
   order-of-evaluation side effects of class inheritance.

I would recommend that you look into binding data to your class parameters 
via Puppet 3's hiera-based automated data binding facility, and avoid 
parameterized-style class declarations altogether.  Really, it's the only 
mode in which I ever recommend using parameterized classes.  It will get 
you around the issues you are having with the order of class declaration 
evaluation by allowing you to make all declarations of each class 
equivalent.  That situation is one of the traditional strengths of Puppet's 
DSL, but it is broken by use of parameterized-style class declarations.


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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/puppet-users/894b627b-c040-41e9-9f18-bb149f86548a%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to