On Mon, 2012-09-10 at 12:34 -0700, Douglas Garstang wrote:
> Why does this:
> 
> Class['network::base'] -> Class['apt::base'] -> Class['lvm::setup'] ->
> Class <| |>
> 
> generate this error?
> 
> err: Could not retrieve catalog from remote server: Error 400 on
> SERVER: Resource type class doesn't exist at
> /truth/sauce/env/prod/modules/role/manifests/common.pp:18 on node
> mon01.ap1.xxx.com
> warning: Not using cache on failed catalog
> err: Could not retrieve catalog; skipping run

Classes are not resources. As a result, you cannot use the resource
collection syntax <| |> on classes.

Even if it worked, this wouldn't do what you wanted! Class <| |> would
include Class['network::base'] and all the others, giving dependency
cycles, like this:

Class['network::base'] -> Class['apt::base'] -> Class['lvm::setup'] -> 
Class['network::base']

> I've been repeatedly told to stop using run stages, and use resource
> chaining instead. However, without putting the Class <| |> at the end,
> to indicate that every other class should come afterwards, the
> functionality is not the same. With run stages, I could specify that
> classes A, B and C should applied first, before everything else.

If you're sure that you will always need these classes run before
everything else, a run stage might still make sense. You would want to
have one run stage in addition to main, perhaps like this:

stage { 'early_setup':
  before => Stage['main'],
}

class { 'network::base':
  stage => 'early_setup',
}
class { 'apt::base':
  stage => 'early_setup',
}
class { 'lvm::setup':
  stage => 'early_setup',
}

Class['network::base'] -> Class['apt::base'] -> Class['lvm::setup']

(In your case, you'd want to put the exec for apt-get update into the
same 'early_setup' stage as well, for example by putting it into the
apt::base class). If you later add additional apt repositories, you'd
have to put them into the same early stage as well, so they can be
configured before doing the apt-get update.

Everything else can then go in the main stage, and should be ordered
only relative to each-other.

The general advice that I've seen is that you should use a limited
number of stages only for cases like this where you need some system
setup that is independent of the other things that you'll be installing
on the system, and must be ordered before (or after) *everything* else.

Do keep in mind the things listed in
http://docs.puppetlabs.com/puppet/2.7/reference/lang_run_stages.html#limitations-and-known-issues
in particular, make sure that the classes in the non-main stage don't
include other classes without setting the stage on them as well!

-- 
Calvin Walton <calvin.wal...@kepstin.ca>

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