为什么 Puppet 模块的主要 class 会被子 class 包含?

Why would a Puppet module's main class be included by a sub-class?

puppetlabs/apache 模块中的许多区域,例如 vhost.pp,您可以看到错误处理要求首先包含基础 class,因为有问题的 class 使用其参数默认值中的基础class。

dev.pp 中没有参数,但您可以看到 $::apache::dev_packages 的引用,它由 ::apache::params class 声明,而 ::apache 是已初始化。

但是,在 vhosts.pp 中,您可以看到显式包含了基数 class,而没有预料到它之前已包含。

我对此的理解是 apache::vhosts 旨在用作独立的 class 并且包含 ::apache 初始化 Apache 的默认配置,由模块确定。但是,如果在其他地方声明了 Apache,例如:

class { '::apache':
  *params*
}

然后包含基数 class 会利用作为参数传递给基数 class 的任何值。那是对的吗?为什么两个publicclassapache::vhostsapache::dev会有两个不同的使用要求?

Why would a Puppet module's main class be included by a sub-class?

首先,这些不是 base 和 subclasses。 Puppet 确实有 class 继承,但 apache::dev 不使用它,并且 apache::vhost 甚至不是 class(它是定义的类型)。 apache class 是模块的 "main" class,而 apache::dev 只是同一模块中的另一个 class。

几乎 class 继承的唯一好处是支持从另一个 class 的变量中获取 class 参数默认值,但显然,控制 Puppet 在线的人文档也不再认为这是个好主意(尽管您仍然可以在 class apache 中看到示例)。 Hiera 对模块中数据的支持是一个不错的选择,但我有时认为 Puppet, Inc. 对他们闪亮的新产品过于着迷,而对旧功能过于轻视,这些旧功能在按文档使用时可以正常工作,但在误用时会不幸中断。

Here in dev.pp there are no parameters

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

However, in vhosts.pp you can see that the base class is included explicitly without an expectation that it was previously included.

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

My understanding of this is that apache::vhosts is designed to be used as a standalone class and it's inclusion of ::apache initializes Apache's default configuration as determined by the module.

不完全是。 apache::vhost 旨在成为 public 类型,并且它确实声明 ::apache 以确保支持它所需的一切确实得到管理。如果愿意,您可以将其描述为 "standalone"。但是包含::apache就和其他地方一样没有区别了。如果那个 class 已经被添加到目录中,那么它就没有额外的效果。否则,它会被添加,从 Hiera 数据中提取参数,其中定义了此类参数数据,而没有硬编码默认值。 Hiera 是如何 应该 ,一般来说,自定义 class 参数,而在这样做的地方,生成的 apache 配置没有准确地描述为 "default" 或由模块。

However, if Apache is declared elsewhere such as:

class { '::apache':
  *params*
}

Then the inclusion of the base class utilizes whatever values were passed as arguments to the base class.

如果这样一个类似资源的 class 声明 已经被评估 那么,正如我已经说过的, apache::vhost 的包含类声明已经没有额外的效果。但是,如果这样一个类似资源的 class 声明被评估 之后 那么目录构建将失败。这是避免类似资源的 class 声明并依赖通过 Hiera 进行数据绑定以进行 class 参数自定义的主要原因之一。

Why would two public classes apache::vhosts and apache::dev have two different requirements for usage?

因为该模块是由数百名贡献者多年开发的。这产生了一些不一致也就不足为奇了。尤其如此,因为即使是为模块做出贡献的 Puppet 开发人员也处于启蒙之路的不同阶段。

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