为什么 Puppet 模块的主类会包含在子类中?
首先,这些不是基类和子类。Puppet 确实有类继承,但apache::dev
不使用它,apache::vhost
甚至不是一个类(它是一个定义的类型)。该类apache
是模块的“主”类,apache::dev
只是同一模块中的另一个类。
几乎类继承的唯一好用处是支持从另一个类的变量中获取类参数默认值,但显然,控制 Puppet 在线文档的人也不再认为这是一个好主意(尽管您仍然可以在课堂上看到一个示例apache
)。Hiera 对模块中数据的支持是一个不错的选择,但我有时认为 Puppet, Inc. 过于着迷于他们闪亮的新好东西,并且过于轻视旧功能,这些功能在按文档使用时可以正常工作,但在误用时会不幸中断。
在 dev.pp 中没有参数
...并且不包含 class apache
。但是有一些代码apache
会在尚未单独声明 的事件中导致目录构建失败。
但是,在 vhosts.pp 中,您可以看到基类被显式包含,而不期望它之前被包含。
是的,这很正常。确实,比apache::dev
的行为更正常。 apache::vhost
旨在供公众使用,因此如果您声明一个实例,那么它会确保它所需的所有内容也包含在目录中。
我对此的理解是,它apache::vhosts
被设计为用作独立类,它包含::apache
初始化 Apache 的默认配置,由模块确定。
不完全是。 apache::vhost
旨在成为公共类型,并且它确实声明::apache
以确保支持它所需的一切确实得到管理。如果您愿意,您可以将其描述为“独立”。但是包含::apache
与其他任何地方都没有什么不同。如果该类已添加到目录中,则它没有其他效果。否则,它会被添加,参数从定义了此类参数数据的 Hiera 数据中提取,而没有硬编码的默认值。一般而言, Hiera 是自定义类参数的方式,并且在这样做的地方,生成的 apache 配置没有准确地表征为“默认”或由模块定义。
但是,如果 Apache 在其他地方声明,例如:
class { '::apache':
*params*
}
然后包含基类使用作为参数传递给基类的任何值。
如果已经评估了这样一个类似资源的类声明,那么正如我已经说过apache::vhost
的,类似包含的声明没有额外的效果。但是,如果稍后评估这种类似资源的类声明,那么目录构建将失败。这是避免类资源声明并依赖通过 Hiera 进行数据绑定来自定义类参数的主要原因之一。
为什么两个公共类 apache::vhosts 和 apache::dev 会有两个不同的使用要求?
因为该模块是由数百名贡献者多年来开发的。产生一些不一致也就不足为奇了。尤其是因为即使是为模块做出贡献的 Puppet 开发人员也处于启蒙之路的不同阶段。
选择 的方法的唯一合理理由apache::dev
是避免干扰稍后评估的类资源声明apache
,但通过强制不同的失败来避免此类失败并不是主要收获。它确实提供了在无论如何都会失败的情况下提供更清晰诊断的机会,但代价是在其他情况下它可以正常工作的任意失败。