我有一个类定义,需要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)
如果您控制两个模块,则应编写第三个类(模块)来管理共享资源.
class build_essential {
package { 'build-essential': ensure => installed }
}
Run Code Online (Sandbox Code Playgroud)
仅需要包的上下文
include build_essential
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17895 次 |
| 最近记录: |