![具有一个共同资源的不同 Puppet 模块](https://linux22.com/image/583204/%E5%85%B7%E6%9C%89%E4%B8%80%E4%B8%AA%E5%85%B1%E5%90%8C%E8%B5%84%E6%BA%90%E7%9A%84%E4%B8%8D%E5%90%8C%20Puppet%20%E6%A8%A1%E5%9D%97.png)
我正在为我的服务器的不同角色编写特定的模块。所以我有一个木偶和一个木偶仪表板-模块。木偶模块确保 puppet 正确安装。木偶仪表板当然,对于 puppet-dashboard 来说也是一样。
两个模块都需要 puppetlabs apt 源(顺便说一下,我正在使用https://github.com/puppetlabs/puppet-apt)因此,我在木偶和木偶仪表板-模块:
apt::source { "puppetlabs":
location => "http://apt.puppetlabs.com",
release => "squeeze",
repos => "main",
required_packages => true,
include_src => false,
key => "4BD6EC30",
key_server => "pgp.mit.edu",
}
现在我的代理出现以下错误:
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate declaration: Apt::Source[puppetlabs] is already declared in file /etc/puppet/modules/puppet/manifests/base.pp at line 27; cannot redeclare at /etc/puppet/modules/puppet-dashboard/manifests/init.pp:42 on node server123
各个模块之间是相互独立的。因此,我认为在每个模块中单独设置此 apt 源的依赖关系是正确的。
一种解决方法是将一个源重命名为puppetlabs
或puppetlabs2
诸如此类。但一定还有其他解决方案。
我对您的回答很好奇!
答案1
每当我遇到这个问题(尤其常见于软件包)时,我只是将资源单独放在一个类中:
class git {
package { 'git': ensure => installed, }
}
然后我包含该类而不是定义资源。
下一个问题:但是它们被不同的模块使用!是的,要么把它们放在 中common
,要么放在其他特定于模块的公共模块中(例如puppet-common
)。
答案2
有几种方法可以解决这个问题。我个人建议将您的 apt 源拆分为一个单独的类,然后使用包含或继承(视情况而定)将此类拉到您需要的任何地方。