尽可能多的人,我和傀儡有一个阶级依赖问题。 一个类得到执行得太早,或者我最终在一个依赖周期。
以下设置:
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
据我了解,节点foo被执行,但有一个base的要求,所以木偶继续执行。 base的第一线需要sources所以木偶将首先执行。 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])
我究竟做错了什么? 有人能指出我正确的方向吗? 重要的是,基础(包括源代码)中的所有东西在课前都会得到执行(因此builddep)
编辑
缩小范围 问题是,builddep不需要源代码在那里。 没有任何要求,在添加源代码之前,builddep会被执行,但需要apt-get更新。 当我的源类添加一个需求时,我又陷入了一个依赖循环。
目前正在尝试这一个: Apt::Source <| |> -> Apt::Builddep <| |> Apt::Source <| |> -> Apt::Builddep <| |> 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])
我认为这是一个在apt中的错误。 builddep通知apt-get update而不是要求它,这在我看来没有多大意义。 您需要在安装构build依赖关系之前执行apt-get update 。
我打补丁apt apt-get update ,这解决了我的依赖周期。 向apt提交了一个pull请求 ,以查看开发人员所说的内容。