Puppet 伪依赖解析排序
我有几个主机上有Docker容器,因此我定义了一个名为Puppet 伪依赖解析排序,puppet,Puppet,我有几个主机上有Docker容器,因此我定义了一个名为apps::Docker的类,它在主机上安装Docker: class apps::docker { include apps::docker::repository, apps::docker::install, apps::docker::service Class["Apps::Docker::Repository"] -> Class["Apps::Docker::Install"] -> Cla
apps::Docker
的类,它在主机上安装Docker:
class apps::docker {
include apps::docker::repository, apps::docker::install,
apps::docker::service
Class["Apps::Docker::Repository"] ->
Class["Apps::Docker::Install"] ->
Class["Apps::Docker::Service"]
Package["Docker"] ~> Service["Docker"]
}
class apps::docker::repository {
apt::source { 'docker':
location => "http://get.docker.io/ubuntu",
key => "A88D21E9",
release => "docker",
repos => "main",
include_src => false
}
}
class apps::docker::install {
package { 'docker':
name => "lxc-docker",
ensure => present
}
class apps::docker::service {
service { 'docker':
provider => 'upstart',
enable => true,
ensure => running,
hasrestart => true,
hasstatus => true
}
}
其实很简单
问题是,当我试图定义一个依赖于这个类的类时,执行顺序会发生错误,命令会失败。例如,我的类profiles::shiningstar::containers
依赖于apps::docker
中定义的profiles::shiningstar
:
class profiles::shiningstar {
include apps::docker
include profiles::shiningstar::containers
Class["Apps::Docker"] -> Class["Profiles::Shiningstar::Containers"]
}
不幸的是,这不起作用,如下所示:
Error: /Stage[main]/Profiles::Shiningstar::Containers::Puppetmaster::Pull/Docker::Image[rfkrocktk/puppetmaster:1.0.5]/Exec[docker pull rfkrocktk/puppetmaster:1.0.5]: Could not evaluate: Could not find command 'docker'
... (similar errors)
Notice: /Stage[main]/Apps::Docker::Repository/Apt::Source[docker]/Apt::Key[Add key: A88D21E9 from Apt::Source docker]/Apt_key[Add key: A88D21E9 from Apt::Source docker]/ensure: created
它把事情搞得乱七八糟。我的配置有什么问题?我如何指定必须满足
apps::docker
的所有依赖项,然后才能profiles::shiningstar::containers
?您应该使用锚定,以确保构建所有依赖项
class apps::docker {
include apps::docker::repository, apps::docker::install,
apps::docker::service
Class["Apps::Docker::Repository"] ->
Class["Apps::Docker::Install"] ->
Class["Apps::Docker::Service"] ->
anchor{"apps::docker":}
Package["Docker"] ~> Service["Docker"]
}
您应该使用一个锚,它将确保构建所有依赖项
class apps::docker {
include apps::docker::repository, apps::docker::install,
apps::docker::service
Class["Apps::Docker::Repository"] ->
Class["Apps::Docker::Install"] ->
Class["Apps::Docker::Service"] ->
anchor{"apps::docker":}
Package["Docker"] ~> Service["Docker"]
}
您可能希望删除内部类,而不仅仅是包含它们
class apps::docker {
contain apps::docker::repository
contain apps::docker::install
contain apps::docker::service
Class['apps::docker::repository']
->
Class['apps::docker::install']
~>
Class['apps::docker::service']
}
请注意,将::install
类作为一个整体通知所有::service
类是有意义的(至少在您的情况下)。在重构这些类的各自实现时,可以更灵活地使用
在第一条注释后编辑-不要试图在包含
语句之间放置链接箭头。您可能希望删除内部类,而不仅仅是包含它们
class apps::docker {
contain apps::docker::repository
contain apps::docker::install
contain apps::docker::service
Class['apps::docker::repository']
->
Class['apps::docker::install']
~>
Class['apps::docker::service']
}
请注意,将::install
类作为一个整体通知所有::service
类是有意义的(至少在您的情况下)。在重构这些类的各自实现时,可以更灵活地使用
在第一条评论后编辑-不要尝试在包含
语句之间放置链接箭头。是类[“Apps::Docker::Service”]->Class[“Profiles::Shiningstar::Containers”]
选项,还是您需要它是类[“Apps::Docker”]
,但如果可以的话,我想避免。原因是我想将实现解耦:我希望安装Docker,但我对其外观的细节不太感兴趣。我认为这可能是相关的:是Class[“Apps::Docker::Service”]->Class[“Profiles::Shiningstar::Containers”]
一个选项,还是需要Class[“Apps::Docker”]
?严格来说这不是必须的,但如果可以的话,我想避免。原因是我想解耦实现:我希望安装Docker,我对它的细节不太感兴趣;它似乎不喜欢contain
语句中的依赖项排序箭头。当对contain语句使用常规的类指令和依赖项排序时,事情仍然是无序的。哦,你说得对!因此,基本上,您的原始代码没有问题,只是您应该将apps::docker
中的include
行替换为contain
行。依赖于apps::docker
的东西将依赖于所有包含的类。-我编辑了我的答案,用这个,我得到了一个语法错误;它似乎不喜欢contain
语句中的依赖项排序箭头。当对contain语句使用常规的类指令和依赖项排序时,事情仍然是无序的。哦,你说得对!因此,基本上,您的原始代码没有问题,只是您应该将apps::docker
中的include
行替换为contain
行。依赖于apps::docker
的东西将依赖于所有包含的类。-我编辑了我的答案,大意是这样的。