【问题标题】:Puppet - test if a package already defined?Puppet - 测试一个包是否已经定义?
【发布时间】:2016-10-25 02:28:25
【问题描述】:

我正在编写一些 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,
    }
}

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

【问题讨论】:

  • 请准确发布这不起作用的原因。您是否收到错误消息,或者它只是简单地没有做它应该做的事情?另请注明您使用的是哪个版本的 Puppet!
  • 上面第二行发布的错误消息 - 我正在测试它是否已经在另一个模块中定义并且测试似乎没有检测到这一点,因此尝试重新定义它并且代理运行失败(请参阅 err )。版本 2.7.11
  • 也许我今天有点无聊:所以你得到了if ! defined... 脚本的错误,对吧?
  • 该错误是在原始帖子“服务器上的错误 400:重复定义:包”等中发布的,因为 if !定义的测试不起作用。
  • my comment below,@MrMorphe。

标签: puppet


【解决方案1】:

您在 defined() 中缺少 Package[]。正确的做法:

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

【讨论】:

【解决方案2】:

最简洁的方法是使用来自puppetlabs-stdlibensure_resource 函数:

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

【讨论】:

  • 从上述库中执行此操作的更简洁的函数是ensure_packages(['pkg1', 'pkg2'])
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    然后在你需要的地方:

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

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多