我想实现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"
}
}
- > (订购箭头)使左侧的资源在右侧的资源之前应用。用连字符和a。写的 大于号。
我希望发生以下情况:
需要
class Level1 {
require Level2
package { "A":
ensure => "installed"
}
}
class Level2 {
require Level3
package { "B":
ensure => "installed"
}
}
class Level3 {
package { "C":
ensure => "installed"
}
}
导致应用所需类中的每个资源 在要求类中的任何资源之前。
我希望发生以下情况:
替代订购
class Level1 {
Class['Level3']->Class['Level2']->Class[Level1']
package { "A":
ensure => "installed"
}
}
class Level2 {
package { "B":
ensure => "installed"
}
}
class Level3 {
package { "C":
ensure => "installed"
}
}
我的假设和结论是否正确?
我一段时间以来一直在搞乱这些依赖关系,他们似乎并没有像我想象的那样表现出来。当与类require
和->
一起使用时,我可能会遗漏一些内容。任何反馈都表示赞赏!!
EDIT1
staging 似乎是修复两个类之间依赖关系的好机制(请参阅here),因为您必须手动定义每个类对之间的阶段依赖关系。你会如何使用三个或四个班级的分期?
EDIT2
考虑这种更现实的情况,其中类用作包装器以同时安装多个包。
每个节点都加载了一些预定义的角色:
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
,但木偶会以任意顺序执行include
命令,因此有些命令(必须首先运行!)不会先运行
尽管有这些链接的努力,似乎木偶正在执行随机时尚类。我究竟做错了什么?是否有更清晰/更好的方法来定义节点,以便我可以确定它们是以特定的预定义方式部署的?
答案 0 :(得分:2)
以下是一个例子:
class L {
package { "C" :
ensure => installed,
require => Package["A", "B",],
}
package { "B" :
ensure => installed,
require => Package["A"],
}
package { "A" :
ensure => installed,
}
}