簡體   English   中英

人偶依賴性解析順序

[英]Puppet dependency resolution ordering

我有幾個主機,上面有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取決於profiles::shiningstar定義的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

它正在完全混亂地執行事情。 我的配置出了什么問題?如何指定profiles::shiningstar::containers之前必須滿足apps::docker profiles::shiningstar::containers所有依賴關系?

您可能想要包含內部類,而不僅僅是包含它們。

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類作為一個整體來notify所有::service類是有意義的。 這樣可以使您更加靈活地重構這些類的相應實現。

在第一個評論之后進行編輯 -請勿嘗試在contain語句之間放置鏈接箭頭。

您應該使用錨點,以確保所有依賴項均已構建

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