简体   繁体   English

人偶依赖性解析顺序

[英]Puppet dependency resolution ordering

I have a couple hosts which have Docker containers on them, so I've defined a class called apps::docker which installs Docker on the hosts: 我有几个主机,上面有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
  }
}

Pretty simple stuff, actually. 实际上,很简单的东西。

The problem is that when I try to define a class which depends on this class, the execution happens out of order and commands fail. 问题是,当我尝试定义一个依赖于该类的类时,执行会乱序进行,命令会失败。 For example, my class profiles::shiningstar::containers depends on apps::docker as defined in profiles::shiningstar : 例如,我的类profiles::shiningstar::containers取决于profiles::shiningstar定义的apps::docker profiles::shiningstar

class profiles::shiningstar {
  include apps::docker
  include profiles::shiningstar::containers

  Class["Apps::Docker"] -> Class["Profiles::Shiningstar::Containers"]
}

Unfortunately, this doesn't work as seen below: 不幸的是,这不起作用,如下所示:

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

It's executing things completely out of order. 它正在完全混乱地执行事情。 What's wrong with my configuration and how can I specify that ALL of the dependencies of apps::docker must be satisfied before profiles::shiningstar::containers ? 我的配置出了什么问题?如何指定profiles::shiningstar::containers之前必须满足apps::docker profiles::shiningstar::containers所有依赖关系?

You probably want to contain the inner classes instead of just including them. 您可能想要包含内部类,而不仅仅是包含它们。

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']
}

Note that it makes sense (in your case at least) to make the ::install class as a whole notify all of the ::service class. 请注意(至少在您的情况下)使::install类作为一个整体来notify所有::service类是有意义的。 The makes you more flexible in refactoring the respective implementation of those classes. 这样可以使您更加灵活地重构这些类的相应实现。

Edited after first comment - don't try to put chaining arrows between contain statements. 在第一个评论之后进行编辑 -请勿尝试在contain语句之间放置链接箭头。

You should use an anchor, that will ensure that all dependencies are built 您应该使用锚点,以确保所有依赖项均已构建

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"]
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM