在单独的类中定义的相同资源的重复声明

Chr*_*now 10 puppet

我有一个类定义,需要build-essential包:

class erlang($version = '17.3') {

  package { "build-essential": 
    ensure => installed
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

不同模块中的另一个类也需要build-essential包:

class icu {

  package { "build-essential": 
    ensure => installed
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试执行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
Run Code Online (Sandbox Code Playgroud)

我期望类封装他们使用的资源,但似乎并非如此?我该如何解决这个冲突?

Pet*_*ter 15

这是处理多个模块时的常见问题.

有很多方法可以做到这一点,最好的做法是模块化并允许安装构建必需的参数:

class icu ($manage_buildessential = false){

  if ($manage_buildessential == true) {
   package { "build-essential": 
     ensure => installed
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

然后,您想要包含您的ICU类:

class {'icu':
   manage_buildessential => 'false',
}
Run Code Online (Sandbox Code Playgroud)

但是,对于快速而肮脏的修复:

if ! defined(Package['build-essential']) {
    package { 'build-essential': ensure => installed }
}
Run Code Online (Sandbox Code Playgroud)

或者如果你有puppetlabs-stdlib模块:

ensure_packages('build-essential')
Run Code Online (Sandbox Code Playgroud)

  • 自从我改用 `ensure_packages` 后,我的生活质量大大提高了。:) (2认同)

Fel*_*ank 5

如果您控制两个模块,则应编写第三个类(模块)来管理共享资源.

class build_essential {
    package { 'build-essential': ensure => installed }
}
Run Code Online (Sandbox Code Playgroud)

仅需要包的上下文

include build_essential
Run Code Online (Sandbox Code Playgroud)

不要用12英寸的杆子接触定义的()功能.这条路上只会有痛苦.