我使用 Puppet 挂载 Cloudfuse 以访问 Rackspace 的 Cloudfiles,但在新主机上,挂载运行过快,即使我需要整个类。在Pro Puppet 中,James 建议像这样拆分类定义:
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,
}
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好。当我准备好挂载时,我需要顶级的父类,如下所示:
exec{'mount /data/cloudfiles':
command => "/usr/local/bin/cloudfuse /data/cloudfiles",
require => [
File['/data/cloudfiles'],
Class['cloudfuse'],
]
}
Run Code Online (Sandbox Code Playgroud)
问题是:
cloudfuse::install
而不是父母吗?我知道 requirecloudfuse::install
会解决我的问题,但是如果我有一个非常简单的类,也许我不会像这样分成三个,那么我必须猜测/查看清单才能知道如何声明依赖项。
披露,我是 Puppet 的开发者之一。
不幸的是,Puppet 中的一个错误意味着一个只包含其他类的类不会导致传递依赖。您可以使用“锚点”模式来解决这个问题,或者您可以向顶级类添加其他无意义的资源,如下所示:
class cloudfuse {
include cloudfuse::install, ...
notify { "hate #8040": message => "work around bug #8040" }
}
Run Code Online (Sandbox Code Playgroud)
您可以关注错误 #8040以观察我们最终修复此问题的时间。