Thx you very much this helps a lot. Just have a last point unclear from your example 4. As you said for example 1: "Puppet will ensure that class_B's definition is evaluated before anything following the "include" line inside class_A's definition" so what's the use of declaring: Class['class_B'] -> Class['class_A'], isn't it redundant?
On Wed, Jan 18, 2012 at 6:03 PM, jcbollinger <[email protected]>wrote: > > > On Jan 18, 4:32 am, Antidot SAS <[email protected]> wrote: > > Hi everyone, > > > > I am just rediting an old post because don't see any answer regarding > this > > matter: > > > I observe that your thread title refers to "import", but there is no > importing in the examples you asked about. I point this out only to > be sure you recognize that there is a big difference between "import" > and "include" -- much bigger, in fact, than the one between "include" > and "inherits". > > As for the questions posed: > > > > In a class, what's the diff between: > > > > *don't take in count syntax, please. > > > > ---------------------------------- > > > > class class_B { > > > > package { fortune } > > > > file { dummy } > > > > } > > > > ---------------------------------- > > > > example 1) > > > > class class_A { > > > > include class_B > > package { foo } > > > > } > > > In this case, any node that declares class_A, directly or indirectly, > will also declare class_B (on account of the "include" statement). > Furthermore, Puppet will ensure that class_B's definition is evaluated > before anything following the "include" line inside class_A's > definition. All of these are server-side considerations. > > > > example 2) > > > > class class_A { > > > > file { bogus > > > > before = > Package [foo], > > > > } > > package { foo > > > > require =>Class["class_B"], > > > > } > > > > } > > > In this case, the Puppet agent will manage all resources declared by > class_B before managing Package foo, and it will manage File bogus > before it manages Package foo *provided that* the node's manifests are > compiled successfully. There is no guarantee that the manifests will > compile, however, because class_A does not ensure that class_B has > been evaluated before refering to it (contrary to Mr. Bria's > assertion). One way to solve that problem would be to "include" > class_B, as in example (1). > > > > example 3) > > > > class class_A inherits class_B { > > > > package { foo } > > > > } > > > Functionally, this is the same as example (1), but as Felix describes, > it is an inappropriate use of class inheritance. > > Just to muddy the waters, I'll add that in addition to the "require" > metaparameter, there is a "require" function related to both the > metaparameter and to the "include" function. To illustrate its use, > these two examples are thoroughly equivalent: > > example 4) > > class_A { > include "class_B" > package { "foo": } > } > > # On nodes, apply class_B before class_A > Class['class_B'] -> Class['class_A'] > > --- > > example 5) > > class_A { > # include class_B AND apply it to nodes > # before this class > require "class_B" > package { "foo": } > } > > > HTH, > > John > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Users" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > 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 [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.
