应用一个人偶 class 而不管其他 class 失败

Getting one puppet class applied regardless of other class failures

给定

manifest/site.pp

...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma
...

在哪里

问题

如何确保 foo::bar 执行完成,而不管任何 baz classes 失败?

我愿意接受有关如何实现这一目标的任何建议。一个首选的解决方案是不需要对 foo 自定义类型进行大量重写,但如果这是唯一的方法,我会这样做。

尝试过的东西

实际问题

我没有意识到 Puppet 会在应用它们中的任何一个应该执行的更改之前尝试实例化所有 classes。即使使用了 'stage',所有 class 都会在任何操作完成之前进行初始化。

真正发生的事情是其中一个自定义类型试图使用 Ruby 实用程序 class,该实用程序依赖于 [=13= 创建的配置文件] class 在它自己的 'initialize' 方法中。

当配置文件不存在时,此实用程序 class 将灾难性地失败。这会级联回 Puppet 并导致它在整个 运行.

期间失败

注意:我仍在学习 Puppet,因此请谨慎应用这些建议。

实际上不可能将 class 完全强制 运行 你正在尝试做。 Puppet 将 总是 初始化您使用的所有 classes,然后再尝试应用 any 它们。即使您使用 'stage' 来尝试强制解决问题。

回想起来,这应该是显而易见的。如果 Puppet 尚未初始化自定义类型实例,则无法调用 'autorequire'、'autobefore'、'autoafter' 或 'autonotify' 方法,因此它无法完成排序,直到它完成.

但是,对于那些 运行 遇到问题的人,这里有各种解决方案可以确保给定的 class 至少 得到应用 在其他 classes.

之前

简单排序

manifest/site.pp

node default {
...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma

Class['foo::bar']
-> Class['baz::alpha']
-> Class['baz::beta']
-> Class['baz::gamma']
...
}

这将按照显示的顺序应用 classes,从 'foo::bar' 到 'baz::gamma' 除非有其他干扰。还有其他运算符可用,请参阅 Language: Relationships

虽然运算符在功能上 接近 class 关系 'before'、'after'、'subscribe'、'notify',据报道,有些差异有时会让您感到困惑。

不过,如果您编写的 classes 是为了重用,不同的设置需要不同的顺序,这仍然是您最好的选择。如果您使用 'profile/role' 设计模式,相同的技术在 'role' classes 中也适用。

阶段

在我尚未 运行 的特殊情况下,可能需要确保某些 class 是 运行 before/after 'main'阶段,或任何其他阶段。使用此方法存在一些问题,请参阅 Language: Run stages

基本思想是您可以声明自己的阶段,并使用上述 'simple' 技术将它们相互关联。然后,您可以将 classes 分配给阶段。每个阶段将按照您指定的顺序 运行,并且该阶段中的 class 将按照它们的自然顺序或您指定的任何顺序 运行。

问题是您必须对 classes 使用 'resource-like' 规范,而不是使用 "include"。这意味着您只能指定 class 一次。如果您尝试指定它两次,它将触发 Puppet 的错误。

module/somewhere/manifest/something.pp

class somewhere::something {
  ...
  include baz::alpha
  include baz::beta
  include baz::gamma

  stage { 'beforemain':
    before => Stage['main'],
  }

  class { 'foo::bar':
    stage => beforemain,
  }

  Class['baz::alpha']
  -> Class['baz::beta']
  -> Class['baz::gama']
}

Class 'foo::bar' 将在所有 'baz' class 之前 应用 因为它 运行在 'beforemain' 阶段,默认情况下,'baz' classes 运行 在 'main' 阶段。

以上内容可行,但如果添加以下内容:

module/elsewhere/manifest/elsewhen.pp

class elsewhere::elsewhen {
  ...
  include foo::bar
  ...
 }

并在与 'somewhere::something' 相同的目录中应用 'elsewhere::elsewhen' class,你将从 Puppet 中得到一个错误。