2013-03-07 60 views
19

我正在写一些傀儡模块,并具有在两个模块中定义的包,因此得到以下错误: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, 
    } 
} 

任何人都可以提出如何解决这个问题,在更广泛的范围内,什么是“适当”的方法来避免这种模块中的冲突?

+0

请张贴究竟如何,这并不工作。你是否收到错误消息,或者它只是简单地做了它应该做的事情?还请包括你正在使用哪个版本的Puppet! – ppeterka 2013-03-07 08:35:34

+0

发布在上面第二行的错误消息 - 我正在测试它是否已经在另一个模块中定义,并且测试似乎没有检测到这一点,因此试图重新定义它,并且代理程序运行失败(请参阅err)。版本2.7.11 – 2013-03-07 08:44:48

+0

也许今天我有点沉闷:所以你得到'如果!定义......脚本,对吧? – ppeterka 2013-03-07 08:47:04

回答

43

你缺少包[]内定义()。正确的方法做到这一点:

if ! defined(Package['gnome-session-fallback']) { 
    package { 'gnome-session-fallback': 
     ensure => installed, 
    } 
} 
+0

干杯Gergo,那工作。 – 2013-05-08 22:15:14

+0

谢谢。这就像一个魅力。 – 2013-05-20 07:10:46

+1

请注意,它并不适用于所有情况,因为defined()是[依赖于解析顺序](https://docs.puppet.com/puppet/4.4/reference/function.html#defined),并且存在[bug因为它打开了很长时间](https://tickets.puppetlabs.com/browse/PUP-1417)。 – 2016-04-13 19:08:52

5

回答我自己关于什么是“正确”方法的问题:这个问题在https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk讨论,jcbollenger提供看起来像“最佳实践”解决方案的东西 - 多次定义的资源应该移入他们自己的模块并包含在他们所依赖的类中。我应用这个并解决了我的问题。

这实际上并没有回答为什么“如果!定义”,然而失败...

11

做到这一点,最彻底的方法是使用从puppetlabs-stdlibensure_resource功能:

ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})

+5

一个更清洁的函数可以从库中执行这个操作,就是'ensure_packages(['pkg1','pkg2'])' – Zaroth 2015-07-15 11:43:07

0

一个更清洁的方式(多种方式中)是创建虚拟包资源然后实现它。您可以多次实现相同的虚拟包,而不会出错。

@package { 'gnome-session-fallback': 
    ensure => installed, 
} 

然后在你需要它:

realize(Package[ 'gnome-session-fallback' ]) 
相关问题