Puppet 为什么木偶模块';主类是否包含在子类中?

Puppet 为什么木偶模块';主类是否包含在子类中?,puppet,puppetlabs-apache,Puppet,Puppetlabs Apache,puppetlabs/apache模块中的许多领域,例如您可以看到错误处理,要求首先包含基类,因为所讨论的类在其“参数默认值”中使用基类 这里没有参数,但您可以看到在初始化::apache时由::apache::params类声明的对$:apache::dev_包的引用 然而,在中,您可以看到基类被显式地包含,而不期望它以前被包含 我对这一点的理解是,apache::vhosts被设计为用作一个独立类,它包含了::apache初始化由模块确定的apache默认配置。但是,如果在其他地方声明Apa

puppetlabs/apache模块中的许多领域,例如您可以看到错误处理,要求首先包含基类,因为所讨论的类在其“参数默认值”中使用基类

这里没有参数,但您可以看到在初始化
::apache
时由
::apache::params
类声明的对
$:apache::dev_包的引用

然而,在中,您可以看到基类被显式地包含,而不期望它以前被包含

我对这一点的理解是,
apache::vhosts
被设计为用作一个独立类,它包含了
::apache
初始化由模块确定的apache默认配置。但是,如果在其他地方声明Apache,例如:

class { '::apache':
  *params*
}
class { '::apache':
  *params*
}
然后,基类的包含利用作为参数传递给基类的任何值。对吗?为什么两个公共类
apache::vhosts
apache::dev
对使用有两种不同的要求

为什么Puppet模块的主类会包含在子类中

首先,这些不是基类和子类。Puppet确实有类继承,但是
apache::dev
没有使用它,而且
apache::vhost
甚至不是一个类(它是一个定义的类型)。
apache
类是模块的“主”类,
apache::dev
只是同一模块中的另一个类

类继承的唯一好用途是支持从另一个类的变量中获取类参数默认值,但显然,控制Puppet在线文档的人也不再认为这是一个好主意(尽管您仍然可以在class
apache
中看到一个示例)。Hiera对模块中数据的支持是一个不错的选择,但我有时认为Puppet,Inc.对其闪亮的新产品过于着迷,对那些在文档中使用时运行良好,但在误用时却不幸中断的旧功能过于不屑一顾

在dev.pp中没有参数

。。。并且不包括类
apache
。但是,如果
apache
尚未单独声明,则有些代码会导致目录构建失败

但是,在vhosts.pp中,您可以看到基类包括在内 明确地没有期望它以前被包括在内

是的,这很正常。事实上,这比apache::dev的行为更正常
apache::vhost
是供公共使用的,因此如果您声明了一个实例,那么它将确保它所需的所有内容也包含在目录中

我对这一点的理解是,
apache::vhosts
被设计为用作一个独立类,它包含了
::apache
初始化由模块确定的apache默认配置

不完全是
apache::vhost
旨在成为一个公共类型,它确实声明了
::apache
,以确保支持它所需的一切都得到了管理。如果您愿意,可以将其描述为“独立”。但是包含的
::apache
与其他任何地方没有什么不同。如果该类已添加到目录中,则它没有其他效果。否则,它将被添加,在定义此类参数数据的情况下,从Hiera数据中提取参数,在未定义此类参数数据的情况下,使用硬编码默认值。Hiera通常是定制类参数的方式,如果这样做了,则生成的apache配置不能准确地描述为“默认”或由模块定义

但是,如果在其他地方声明Apache,例如:

class { '::apache':
  *params*
}
class { '::apache':
  *params*
}
然后,基类的包含利用了所有的值 作为参数传递给基类

如果已经对这样一个类似资源的类声明进行了评估,那么正如我已经说过的,
apache::vhost
的include-like声明没有额外的效果。但如果稍后对此类类似资源的类声明进行求值,则目录构建将失败。这是避免类似资源的类声明并依靠通过Hiera进行的数据绑定来定制类参数的主要原因之一

为什么两个公共类apache::vhosts和apache::dev有两种不同的使用要求

因为该模块是由数百名贡献者多年开发的。这产生了一些不一致性,这并不奇怪。尤其是因为即使是对模块做出贡献的傀儡开发人员也在通往启蒙的道路上处于不同的位置


选择
apache::dev
方法的唯一合理理由是避免干扰稍后评估的类
apache
的类似资源的声明,但通过强制不同的失败来避免这样的失败并不是主要的好处。它确实提供了机会,在无论如何都会失败的情况下提供更清晰的诊断,但在其他情况下,它可能只是工作,而不是以任意失败为代价。

尽管这是一个有趣的问题,这也是一种模拟,因为
params
模式存在于数年前模块数据功能不存在的时候,并且通常不应该再根据最佳实践直接声明类资源。在现代最佳实践中,您将对模块数据(或环境或全局)使用自动参数绑定,然后您的参数查找将符合此要求。@MattSchuchard我完全同意,我认为这是处理模块参数数据的“传统方式”。这完全是出于好奇。谢谢你指出这一点。谢谢你,这真的为我澄清了一切。我感谢您的详细回复!