Puppet 在不同类中定义的相同资源的重复声明
我有一个类定义,它需要Puppet 在不同类中定义的相同资源的重复声明,puppet,Puppet,我有一个类定义,它需要build-essential包: class erlang($version = '17.3') { package { "build-essential": ensure => installed } ... } class icu { package { "build-essential": ensure => installed } ... } 不同模块中的另一个类也需要build-essential包
build-essential
包:
class erlang($version = '17.3') {
package { "build-essential":
ensure => installed
}
...
}
class icu {
package { "build-essential":
ensure => installed
}
...
}
不同模块中的另一个类也需要build-essential
包:
class erlang($version = '17.3') {
package { "build-essential":
ensure => installed
}
...
}
class icu {
package { "build-essential":
ensure => installed
}
...
}
但是,当我尝试执行puppet apply时,收到的错误是:
Error: Duplicate declaration: Package[build-essential] is already declared in file /vagrant/modules/erlang/manifests/init.pp:18; cannot redeclare at /vagrant/modules/libicu/manifests/init.pp:17 on node vagrant-ubuntu-trusty-64.home
我希望类封装它们使用的资源,但事实似乎并非如此?如何解决此冲突?这是处理多个模块时的常见问题 有多种方法可以做到这一点,最佳做法是模块化,并允许安装build essential作为参数:
class icu ($manage_buildessential = false){
if ($manage_buildessential == true) {
package { "build-essential":
ensure => installed
}
}
}
然后,您希望将ICU课程包括在哪里:
class {'icu':
manage_buildessential => 'false',
}
但是,要快速解决问题,请执行以下操作:
if ! defined(Package['build-essential']) {
package { 'build-essential': ensure => installed }
}
或者,如果您有puppetlabs stdlib模块:
ensure_packages('build-essential')
如果您控制这两个模块,那么应该编写第三个类(模块)来管理共享资源
class build_essential {
package { 'build-essential': ensure => installed }
}
只需要包的上下文
include build_essential
不要用12英寸的杆接触defined()函数。在这条路上可能会有麻烦。正如其他答案所解释的,有多种方法,但如果您想多次使用同一资源,这是另一种可靠的方法 声明一次,然后多次实现。例如,创建一个新的虚拟资源,如下所示: 在modules/packages/manifests/init.pp中
class packages {
@package{ 'build-essential':
ensure => installed
}
}
然后,在这两个类中,包含以下行以实现上述虚拟资源
include packages
realize Package('build-essential')
自从我切换到
sure_套餐以来
我的生活质量大幅度提高了。:)