【问题标题】:Why would a Puppet module's main class be included by a sub-class?为什么 Puppet 模块的主类会包含在子类中?
【发布时间】:2020-04-02 05:13:02
【问题描述】:

puppetlabs/apache 模块中的许多区域,例如vhost.pp,您可以看到需要首先包含基类的错误处理,因为所讨论的类在其参数默认值中使用了基类。

dev.pp 中没有参数,但您可以看到对 $::apache::dev_packages 的引用,它在 ::apache 初始化时由 ::apache::params 类声明。

但是,在vhosts.pp 中,您可以看到基类被显式包含,而不是期望它之前被包含。

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

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

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

【问题讨论】:

  • 虽然这是一个有趣的问题,但它也有点没有意义,因为 params 模式早在几年前就存在了,那时模块数据功能还不存在,而且您通常也不应该直接声明类资源不再是最佳实践。在现代最佳实践中,您将使用与模块数据(或环境或全局)的自动参数绑定,然后您的参数查找将符合此要求。
  • @MattSchuchard 我完全同意,我认为这是处理模块参数数据的“传统方式”。出于好奇,这比什么都重要。感谢您指出这一点。

标签: puppet puppetlabs-apache


【解决方案1】:

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

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

几乎类继承的唯一好处是支持从另一个类的变量中获取类参数默认值,但显然,控制 Puppet 在线文档的人也不再认为这是一个好主意(尽管您仍然可以看到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*
}

然后包含基类使用任何值 作为参数传递给基类。

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

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

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

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

【讨论】:

  • 谢谢,这真的让我明白了。感谢您的详细回复!
猜你喜欢
  • 2011-04-20
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 2018-03-24
  • 2012-02-19
相关资源
最近更新 更多