Puppet:如果特定包已经安装,如何遵守 package() 的 install_options

Puppet:如果特定包已经安装,如何遵守 package() 的 install_options

如果有人对这个问题想到一个更好的标题:请相应地进行更改。

环境:

  • Debian jessie 8.5
  • 傀儡大师:3.8.5
  • 傀儡代理:3.7.2
  • 易于:1.0.9.8.3

问题:

节点上已经安装了特定的包,我们举例needrestart来说:

# dpkg -l | grep needrestart
ii  needrestart                     1.2-8+deb8u1

使用以下代码:

package{[
  'needrestart',
]:
  ensure          => installed, # latest won't work, either
  install_options => ['-t', 'jessie-backports']
}

我期望needrestart重新安装/升级到 版本jessie-backports。但是,这并没有发生,没有重新安装/升级发生。在(调试)日志中,没有显示任何与此相关的值得注意的信息。

解决方案:

如果这不是有意的:有人知道解决这个问题的巧妙方法吗?

答案1

你的问题是,你的install_options将只在包资源被使用时才会被使用实际安装您的包裹。您有以下几种选择:

  • 使用ensure => latest并希望进行包更新(或自己触发更新) - 可能不是您想要的。
  • 升级到 Puppet 4.x。自版本 4 以来,Puppet 已刷新时重新安装notify,如果提供商支持,则允许在事件发生时重新安装reinstallable。虽然这在 Debian 上有效,但此选项可能不适合您。
  • 欺骗 Puppet 认为软件包已被卸载 - 这需要您在本地安装上安装 Puppet 补丁,但不推荐。
  • 具有重新安装功能的 Patch Puppet:此错误报告从几年前开始,Aggelos Economopoulos 就供应补丁对于某些版本的 puppet,这看起来相当简单。这应该可以帮助您入门。不过,我不建议修补您的 puppet 代理安装。
  • 自行重新安装:这可能是您现在唯一的选择:写下以下内容:

    exec { "apt-get reinstall $package $your_options":
        user   => 'root',
        onlyif => 'dpkg -s $package| grep 'Version $your_version'
    }
    

    根据有无选项的软件包的差异,这可能非常困难。如果只有少数软件包受到影响,则这是可以管理的。

  • 编写自己的提供程序并将其添加到package,或建立类似package_reinstall: 它非常简单,可以通过模块进行管理和版本控制,并且无需 Puppet 更新即可工作。我建议从提供商/包/apt.rb。这或许才是你最好的选择。

答案2

我相信ensure => installed只会确保它已安装,但如果有更新版本,它不会升级。使用latest它来执行此操作。它也只会在有更新版本时升级。如果您想要的首选版本比当前安装的版本旧,则必须找到一种解决方法。也许exec会检查当前安装的版本是否与其他存储库中的版本不同,如果不同,则卸载,然后让包资源安装正确的版本。

答案3

您需要触发安装操作安装选项才能生效。一个可能的解决方法是先ensure => absent,然后在删除软件包后,您可以ensure => presentensure => 1.2-8+deb8u1,并且后续安装将遵守安装选项

答案4

我使用APT pinning它已经有一段时间了,我相信这是最干净的解决方案(之一),特别是与unattended upgrades和/或常规结合使用时apt-get dist-upgrade

相关内容