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

Mr *_*phe 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
Run Code Online (Sandbox Code Playgroud)

因此,要确保尚未定义包但以下方法不起作用:

if ! defined ('gnome-session-fallback') {
    package { 'gnome-session-fallback':
        ensure => installed,
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ger*_*osi 46

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

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

  • 请注意,它并不适用于所有情况,因为defined()[依赖于解析顺序](https://docs.puppet.com/puppet/4.4/reference/function.html#defined)并且有一个[bug]它开了很长时间](https://tickets.puppetlabs.com/browse/PUP-1417). (2认同)

小智 13

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

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

  • 从所述库中执行此操作的更清晰的功能是`ensure_packages(['pkg1','pkg2'])` (7认同)

Mr *_*phe 5

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

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