Puppet - 测试一个包已经定义了吗?

时间:2013-03-07 08:26:43

标签: 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,
    }
}

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

4 个答案:

答案 0 :(得分:44)

你在Define()中缺少Package []。正确的方法:

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

答案 1 :(得分:12)

最简洁的方法是使用puppetlabs-stdlib中的ensure_resource函数:

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

答案 2 :(得分:5)

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

这实际上并没有回答为什么“if!defined”失败但是......

答案 3 :(得分:1)

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

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

然后你需要它:

realize( Package[ 'gnome-session-fallback' ] )