无论其他课程失败如何,都可以申请一个木偶课程

时间:2018-02-25 17:06:03

标签: puppet

鉴于

清单/ site.pp

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

其中

  • foo::bar创建/etc/puppetlabs/puppet/config_file.yaml
  • foo::alphafoo::gamma是使用puppet_x类的自定义类型,需要上述文件才能运行,如果文件不可用,则会抛出Puppet::Error
  • baz::alphabaz::gamma是使用自定义类型foo:beta`` through foo:gamma```来定义资源的类。

问题

如果foo::bar类的任何失败,我如何确保baz执行完成?

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

尝试的事情

  • 使用Class['foo::bar'] -> Class[...] -> ...(短划线箭头)确保申请顺序。
  • 使用Class['foo::bar'] ~> Class[...] -> ...(代字号箭头)确保申请顺序。
  • autorequire(:file)添加到所有foo::alphafoo::gamma自定义类型。
  • foo::bar与任何其他班级之间不存在任何关系。
  • 在所有catch Puppet:error do err(message) end自定义类型提供商中尝试foo

实际问题

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

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

当配置文件不存在时,此实用程序类将发生灾难性故障。哪个会级联回Puppet并导致它在整个运行中失败。

1 个答案:

答案 0 :(得分:0)

注意:我还在学习Puppet,所以要小心应用这些建议。

实际上,在您完成其他所有其他操作之前,强制课程无法完全运行 。在尝试应用任何之前,Puppet将始终初始化您使用的所有类。即使你使用了一个'阶段'试图强迫这个问题。

回想起来,这应该是显而易见的。 Puppet无法调用“自动查询”,“自动运行”,“自动运行”,“自动通知”,“自动通知”等。方法如果它还没有初始化自定义类型实例,那么它就无法完成排序。

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

简单订购

清单/ 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']
...
}

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

虽然运营商在功能上关闭,但在'之后,'在'之后,'订阅',' ;通知',据报道,差异可能会偶尔绊倒你。

尽管如此,如果您已经编写了类以供重复使用,并且不同设置需要不同的排序,这仍然是您最好的选择。相同的技术适用于“角色”。如果您正在使用'个人资料/角色'设计模式。

<强>阶段

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

基本的想法是,你可以声明自己的阶段,并使用简单的&#39;来相互联系。以上技术。然后,您可以将类分配给阶段。每个阶段都将按照您指定的顺序运行,该阶段中的类将以其自然顺序或您指定的任何顺序运行。

问题是你必须使用类似资源的&#39;类的规范,而不是使用&#34; include&#34;。这意味着您只能指定一次类。如果您尝试将其指定两次,则会从Puppet触发错误。

模块/某处/清单/ 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&#39; foo :: bar&#39;将在所有&#39; baz&#39;之前应用课程,因为它运行在&#39; beforemain&#39;阶段,默认情况下,&#39; baz&#39;课程在“主要”课程中进行。阶段。

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

模块/别处/清单/ elsewhen.pp

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

并应用&#39;其他地方:: elsewhen&#39;在同一目录中的某个类&某些地方::某些事情&#39;,您将从Puppet获得错误。