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