Puppet 在不考虑其他类失败的情况下应用一个傀儡类

Puppet 在不考虑其他类失败的情况下应用一个傀儡类,puppet,Puppet,给定的 清单/site.pp 在哪里 foo::bar创建/etc/puppetlabs/puppet/config_file.yaml foo::alpha到foo::gamma是自定义类型,它们使用需要上述文件操作的puppet\u x类,如果文件不可用,将抛出puppet::Error baz::alpha到baz::gamma是使用自定义类型foo:beta``到foo:gamma``来定义资源的类 问题 我如何确保foo::bar执行到完成,而不考虑任何baz类的失败 我愿意接受任

给定的

清单/site.pp

在哪里

  • foo::bar
    创建
    /etc/puppetlabs/puppet/config_file.yaml
  • foo::alpha
    foo::gamma
    是自定义类型,它们使用需要上述文件操作的
    puppet\u x
    类,如果文件不可用,将抛出
    puppet::Error
  • baz::alpha
    baz::gamma
    是使用自定义类型
    foo:beta``到
    foo:gamma``来定义资源的类
问题

我如何确保
foo::bar
执行到完成,而不考虑任何
baz
类的失败

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

尝试过的事情

  • 使用
    类['foo::bar']->Class[…]->…
    (虚线箭头)以确保应用程序的顺序
  • 使用
    Class['foo::bar']~>Class[…]->…
    (波浪形箭头)以确保应用程序的顺序
  • 通过
    foo::gamma
    自定义类型向所有
    foo::alpha
    添加
    autorequire(:file)
  • foo::bar
    和任何其他类之间不保留任何关系
  • 在所有的
    foo
    自定义类型提供程序中,尝试
    catch Puppet:error do err(message)end
实际问题

我没有意识到Puppet会在应用任何类应该执行的更改之前尝试实例化所有类。即使使用了“stage”,所有类都会在完成任何操作之前初始化

实际情况是,其中一个自定义类型试图使用一个Ruby实用程序类,该类依赖于配置文件,该配置文件是由
foo::bar
类在其自己的“initialize”方法中创建的

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

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

实际上,不可能强制一个类在您尝试执行所有其他操作之前完全运行。Puppet总是在尝试应用任何类之前初始化您使用的所有类。即使你用一个“舞台”试图强迫这个问题

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

然而,对于那些遇到问题的人来说,这里有各种解决方案,可以确保给定的类至少在其他类之前应用

简单排序

清单/site.pp

这将按照显示的顺序应用类,从“foo::bar”到“baz::gamma”,除非有其他干扰。还有其他操作员可用,请参阅

虽然操作符在功能上与类关系“before”、“after”、“subscribe”、“notify”非常接近,但据报道,存在一些差异,有时会让您感到困惑

尽管如此,如果您编写的类是为了重用,不同的设置需要不同的顺序,那么这仍然是您的最佳选择。如果您使用的是“profile/role”设计模式,那么同样的技术也适用于“role”类

阶段

在我尚未遇到的特殊情况下,可能需要确保某些课程在“主要”阶段或任何其他阶段的所有内容之前/之后运行。使用此方法存在一些问题,请参阅

基本思想是,您可以声明自己的阶段,并使用上面的“简单”技术将它们相互关联。然后可以将类分配给阶段。每个阶段将按您指定的顺序运行,该阶段中的类将按其自然顺序或您指定的任何顺序运行

问题是您必须为类使用“类似资源”的规范,而不是使用“包含”。这意味着您只能指定一次类。如果您尝试指定它两次,它将从Puppet触发一个错误

模块/where/manifest/something.pp

类“foo::bar”将在所有“baz”类之前应用,因为它运行在“beforemain”阶段,而默认情况下,“baz”类运行在“main”阶段

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

模块/where/manifest/elsewhen.pp


并将“别处::elsewhen”类应用到与“某处::某物”相同的目录中,您将从Puppet中得到一个错误。

只是一个建议,因为您尚未发布完整的清单定义-我发现
之前的
之后的
需要
,非常有用,
notify
选项-Before和notify在功能上等同于虚线箭头和波浪形箭头。(我想我已经找到了正确的解决方法。)无论如何,我找到了问题的真正根源,并将在我确认修复方案有效后立即发布答案。我在之前和之后都提到了,因为它们不是。我知道他们应该是,但我从来没有遇到过问题。为此我一直恨木偶。
...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma
...
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']
...
}
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 elsewhere::elsewhen {
  ...
  include foo::bar
  ...
 }