Puppet 伪依赖解析排序

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

我有几个主机上有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"] ->
  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
的东西将依赖于所有包含的类。-我编辑了我的答案,大意是这样的。