Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Puppet 在不同类中定义的相同资源的重复声明_Puppet - Fatal编程技术网

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_套餐以来
我的生活质量大幅度提高了。:)