我已完成本地Puppet安装:
# puppet module install puppetlabs/apt
Preparing to install into /etc/puppet/modules ...
Downloading from http://forge.puppetlabs.com ...
Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apt (v1.1.0)
└── puppetlabs-stdlib (v3.2.0)
我还要申请以下nodes.pp
:
node default {
include stdlib
class {'apt':
always_apt_update => true,
disable_keys => true,
stage => 'setup'
}
->
apt::source { "cassandra":
location => "http://debian.datastax.com/community",
release => "stable",
repos => "main",
key => "B999A372",
key_source => "http://debian.datastax.com/debian/repo_key",
include_src => false
}
}
当我尝试应用它时,我得到:
# puppet apply nodes.pp
err: Could not apply complete catalog: Found 1 dependency cycle:
(Anchor[apt::key B999A372 present] => Apt::Key[Add key: B999A372 from Apt::Source cassandra] => File[cassandra.list] => Exec[apt_update] => Class[Apt::Update] => Stage[setup] => Stage[main] => Class[Main] => Node[default] => Apt::Source[cassandra] => File[cassandra.list])
Try the '--graph' option and opening the resulting '.dot' file in OmniGraffle or GraphViz
notice: Finished catalog run in 0.12 seconds
问题似乎在stage => 'setup'
参数中,但我想了解发生了什么,我该怎么做才能解决这个问题(我已经继承了大型木偶代码库 - 上面只是一个概念证明 - 它使用了stage
的东西而我还不想删除它,因为我没有得到Puppet的内在工作得很好atm)。
更新#1
尝试将apt::source
步骤移至setup
阶段,如下所示:
class cassandra {
apt::source { "cassandra":
location => "http://debian.datastax.com/community",
release => "stable",
repos => "main",
key => "B999A372",
key_source => "http://debian.datastax.com/debian/repo_key",
include_src => false
}
}
node default {
include stdlib
class {'apt':
always_apt_update => true,
disable_keys => true,
stage => setup
}
->
class {'cassandra': stage => setup}
}
然而,这并没有解决问题,只是生成另一个依赖循环。
err: Could not apply complete catalog: Found 1 dependency cycle:
(Anchor[apt::key B999A372 present] => Apt::Key[Add key: B999A372 from Apt::Source cassandra] => File[cassandra.list] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::update] => Class[Apt] => Class[Cassandra] => Apt::Source[cassandra] => File[cassandra.list])
完整调试输出here。依赖图是
所以在我看来,试图在“自然”中强制执行操作顺序。方式(通过->
运算符)导致这种奇怪的依赖循环。
答案 0 :(得分:3)
基本上看起来你的apt :: source指定了一个键。 apt :: key的apt :: source声明指出在添加文件cassandra.list之前需要处理apt :: key。这有道理吗?
但是后来cassandra文件资源有一个exec ['apt_update']的通知,它存在于apt :: update中。它是一个refreshonly包,只由正在执行的cassandra文件资源触发并通知它。
Exec ['apt_update']在apt :: update中,因此需要对Class ['apt :: update']进行处理才能被视为已处理。
现在,apt声明中出现了实际问题。您已使用元参数stage =>声明了apt(apt模块的init清单) '建立'。你会发现apt实际上包含了apt :: update,这很好 - 但它也定义了一个锚'apt :: update',其中需要类apt :: update。由于apt依赖于apt :: update,我们现在也从设置阶段对apt :: update进行了隐式依赖。
主要阶段取决于设置阶段,任何未给定阶段的东西都会自动选择主阶段 - 因此File ['cassandra.list']也是主要阶段资源(但需要在apt ::之前发生)更新是隐式的设置阶段资源!)
我希望有所帮助,看起来相当复杂 - 特别是对于锚点。