我正在编写一些puppet模块,并在两个模块中定义了一个包,因此得到以下错误:
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate definition: Package[gnome-session-fallback] is already defined in file /etc/puppet/modules/vnc4server/manifests/init.pp at line 3; cannot redefine at /etc/puppet/modules/vino/manifests/init.pp:7 on node l因此,我希望确保尚未定义该包,但以下内容不起作用:
if ! defined ('gnome-session-fallback') {
package { 'gnome-session-fallback':
ensure => installed,
}
}有没有人可以建议如何解决这个问题,以及在更广泛的范围内,什么是避免模块中发生此类冲突的“适当”方法?
发布于 2013-03-10 07:13:40
在defined()中缺少Package[]。正确的做法是:
if ! defined(Package['gnome-session-fallback']) {
package { 'gnome-session-fallback':
ensure => installed,
}
}发布于 2014-06-10 03:34:37
最简单的方法是使用puppetlabs-stdlib中的ensure_resource函数
ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})
发布于 2013-03-07 21:58:47
为了回答我自己关于“适当”方法是什么的问题:这个问题在https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk上讨论过,jcbollenger提供了一个看起来像是“最佳实践”的解决方案--多次定义的资源应该移动到它们自己的模块中,并包括到它们所依赖的类中。我应用了这个并解决了我的问题。
然而,这并不能真正回答为什么"if !defined“会失败...
https://stackoverflow.com/questions/15266347
复制相似问题