我想实现 puppet 类之间的依赖关系,以便类(它们的内容)以确定的方式执行。阅读文档我想出了以下两种方法:
订购
class Level1 {
Class['Level2']->Class[Level1']
package { "A":
ensure => "installed"
}
}
class Level2 {
include Level3
package { "B":
ensure => "installed"
}
}
class Level3 {
package { "C":
ensure => "installed"
}
}
-> (ordering arrow) Causes the resource on the left to be applied before the resource on the right. Written with a hyphen and a greater-than sign.
我预计会发生以下情况:
- Level2 在 Level1 之前调用
- 安装包 B 或 C(顺序可以是随机的,因为未指定)
- 安装包 A。
需要
class Level1 {
require Level2
package { "A":
ensure => "installed"
}
}
class Level2 {
require Level3
package { "B":
ensure => "installed"
}
}
class Level3 {
package { "C":
ensure => "installed"
}
}
cause every resource in the required classes to be applied before any of the resources in the requiring class.
我预计会发生以下情况:
- Level3 被 Level2 调用
- 安装包 C
- Level2 被 Level1 调用
- 安装包 B
- 安装包 A
替代订购
class Level1 {
Class['Level3']->Class['Level2']->Class[Level1']
package { "A":
ensure => "installed"
}
}
class Level2 {
package { "B":
ensure => "installed"
}
}
class Level3 {
package { "C":
ensure => "installed"
}
}
- 级别 2 需要级别 1
- 3 级需要 2 级
- 软件包 C 已安装
- 安装包 B
- 安装包 A
我的假设和结论正确吗?
我已经搞乱这些依赖关系有一段时间了,它们的行为似乎并不像我想象的那样。也许我在与类一起使用 require
和 ->
时遗漏了一些东西。如有任何反馈,我们将不胜感激!!
编辑1
分段似乎是修复两个类之间的依赖关系的良好机制(请参阅 here ),因为您必须手动定义每个类对之间的阶段依赖关系。您将如何使用三级或四级级别的舞台?
编辑2
考虑这个更现实的情况,其中类 a 用作包装器来同时安装多个包。
每个节点都在加载一些预定义的角色:
node 'some-host' {
include role::processing_machine
}
角色定义如下:
class role::processing_machine {
include role::ubuntu_desktop_standard_software
include xorg::lts_12_04_quantal
include software::standard_packages
# define order in which classes should be executed
Class["role::ubuntu_desktop_standard_software"] -> Class["xorg::lts_12_04_quantal"] -> Class["software::standard_packages"] -> Class["role::processing_machine"]
}
这是role::ubuntu_desktop_standard_software
定义:
class role::ubuntu_desktop_standard_software {
include role
include profile::ubuntu_desktop
include role::server::no_apache
# define order in which classes should be executed.
Class["role"] -> Class["profile::ubuntu_desktop"] -> Class["role::server::no_apache"] -> Class["role::ubuntu_desktop_standard_software"]
}
如您所见,我正在尝试链接多个类,以便它们按特定顺序执行(Class["a"] -> Class["b"]
)。以前我只在我的类中使用 include
但 puppet 会以任意顺序执行 include
命令,因此某些命令(必须先运行!)不会首先运行。
尽管进行了这些链接努力,但 puppet 似乎仍然在执行类随机方式。我究竟做错了什么?是否有更清晰/更好的方法来定义节点,以便我可以确保它们以特定的预定义方式部署?
最佳答案
这是一个例子:
class L {
package { "C" :
ensure => installed,
require => Package["A", "B",],
}
package { "B" :
ensure => installed,
require => Package["A"],
}
package { "A" :
ensure => installed,
}
}
关于puppet - puppet 类的 require 和 ordering 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821690/