Puppet 类/节点依赖关系

Puppet 类/节点依赖关系

和许多人一样,我在使用 puppet 时也遇到了类依赖问题。要么某个类执行得太早,要么我最终陷入依赖循环。

按照以下设置:

node foo:
  require base
  include somethingelse

class base:
  require sources // <- class defines package sources needed for everything

class somethingelse
  apt::builddep { 'foo': } // <- requires some package sources

据我了解,nodefoo已执行但有一个要求base,因此 puppet 会首先执行它。base的第一行需要sources,所以 puppet 将首先执行它。builddep最后执行。

然而,它的作用恰恰相反。源随时都会被执行,没有任何逻辑(就像没有依赖项的资源一样)。builddep 之后多次会导致 puppet 错误,因为它所需的源尚未存在。

当我像这样定义节点依赖关系时:

include "base"
include "somethingelse"

Class['base'] -> Class['somethingelse']

或者将其添加Class['sources']为对 builddep 的依赖,我得到了类似这样的依赖循环:

(Anchor[apt::source::puppetlabs] => Apt::Source[puppetlabs] => Class[Sources] => Class[Base] => Cron[execute-puppet] => Class[Base] => Class[somethingelse] => Apt::Builddep[foo] => Exec[apt-builddep-foo] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::source::puppetlabs])

我做错了什么?有人能指出我正确的方向吗?重要的是,基础中的所有内容(包括源)都在类之前执行somethingelse(因此 builddep 也是如此)

编辑

缩小范围。问题是,builddep 不需要源存在。没有任何要求,builddep 会在添加源之前执行,但需要 apt-get update。当我向源类添加要求时,我再次陷入依赖循环。

目前正在尝试这个:Apt::Source <| |> -> Apt::Builddep <| |>结果是

(Anchor[apt::source::puppetlabs] => Apt::Source[puppetlabs] => Apt::Builddep[foo] => Exec[apt-builddep-foo] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::source::puppetlabs])

答案1

我得出结论,这是 apt 中的一个错误。builddep它通知apt-get update而不是要求它,在我看来这没有多大意义。你想apt-get update被执行安装构建依赖项。

我修补了 apt 以 require apt-get update,这解决了我的依赖循环。提交了一个拉取请求看看开发人员说了什么。

相关内容