19

我正在编写一些木偶模块并在两个模块中定义了一个包,因此出现以下错误:

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,
    }
}

任何人都可以建议如何解决这个问题,并且在更广泛的范围内,避免模块中此类冲突的“正确”方法是什么?

4

4 回答 4

46

您在定义的()中缺少包 []。正确的做法:

if ! defined(Package['gnome-session-fallback']) {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}
于 2013-03-09T23:13:39.870 回答
13

最干净的方法是使用puppetlabs-stdlibensure_resource中的函数:

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

于 2014-06-09T19:34:36.603 回答
5

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

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

于 2013-03-07T13:58:46.717 回答
1

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

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

然后在你需要的地方:

realize( Package[ 'gnome-session-fallback' ] )
于 2016-10-24T18:28:25.893 回答