鉴于
清单/ site.pp
...
include foo::bar
include baz::alpha
include baz::beta
include baz::gamma
...
其中
foo::bar
创建/etc/puppetlabs/puppet/config_file.yaml
foo::alpha
到foo::gamma
是使用puppet_x
类的自定义类型,需要上述文件才能运行,如果文件不可用,则会抛出Puppet::Error
。baz::alpha
到baz::gamma
是使用自定义类型foo:beta`` through
foo:gamma```来定义资源的类。问题
如果foo::bar
类的任何失败,我如何确保baz
执行完成?
我愿意接受有关如何实现这一目标的任何建议。首选解决方案是不需要对foo
自定义类型进行大量重写,但如果这是唯一的方法,我会这样做。
尝试的事情
Class['foo::bar'] -> Class[...] -> ...
(短划线箭头)确保申请顺序。Class['foo::bar'] ~> Class[...] -> ...
(代字号箭头)确保申请顺序。autorequire(:file)
添加到所有foo::alpha
到foo::gamma
自定义类型。foo::bar
与任何其他班级之间不存在任何关系。catch Puppet:error do err(message) end
自定义类型提供商中尝试foo
。实际问题
我没有意识到Puppet会在应用其中任何一个应该执行的更改之前尝试实例化所有类。即使使用“阶段”,所有类在完成任何操作之前都会被初始化。
真正发生的事情是,其中一个自定义类型试图使用一个Ruby实用程序类,该实用程序类依赖于foo::bar
类在其自己的'initialize'方法中创建的配置文件。
当配置文件不存在时,此实用程序类将发生灾难性故障。哪个会级联回Puppet并导致它在整个运行中失败。
答案 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获得错误。