我有一个类定义,需要build-essential
包:
class erlang($version = '17.3') { package { "build-essential": ensure => installed } ... }
不同模块中的另一个类也需要build-essential
包:
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
我期望类封装他们使用的资源,但似乎并非如此?我该如何解决这个冲突?
这是处理多个模块时的常见问题.
有很多方法可以做到这一点,最好的做法是模块化并允许安装构建必需的参数:
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