如何在安装之前依靠Puppet类?

我使用Puppet挂载Cloudfuse来访问Rackspace的Cloudfiles,但是在一个新的主机上,尽pipe我需要整个class级,mount仍然运行得太快。 在Pro Puppet中 ,Jamesbuild议像这样分割类定义:

class cloudfuse{ include cloudfuse::install, cloudfuse::service, cloudfuse::config } class cloudfuse::install{ # download and install } class cloudfuse::config{ file{'/root/.cloudfuse': notify => Class['cloudfuse::service'], } } class cloudfuse::service{ service{'cloudfuse': ensure => running, } } 

这工作得很好。 当我准备挂载时,我需要顶级的父类,像这样:

 exec{'mount /data/cloudfiles': command => "/usr/local/bin/cloudfuse /data/cloudfiles", require => [ File['/data/cloudfiles'], Class['cloudfuse'], ] } 

问题是:

  1. 这是惯用的吗? 我在别处见过,所以我会说。
  2. 我应该实际上需要cloudfuse::install而不是父级?

我知道需要cloudfuse::install会解决我的问题,但如果我有一个非常简单的类,也许我不会像这样分裂三个,那么我不得不猜测/看清单知道如何声明依赖关系。

披露,我是Puppet的开发者之一。

不幸的是,Puppet中的一个错误意味着只包含其他类的类不会导致传递依赖。 您可以使用“锚点”模式来解决这个问题,或者您可以添加一个无用的资源给顶层类,如下所示:

 class cloudfuse { include cloudfuse::install, ... notify { "hate #8040": message => "work around bug #8040" } } 

你可以关注bug#8040来观察我们最终得到修正的时间。