和许多人一样,我在使用 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
,这解决了我的依赖循环。提交了一个拉取请求看看开发人员说了什么。