Puppet:如果已经安装了特定的包,如何实现package()的install_options

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

环境:

  • Debian jessie 8.5
  • 木偶大师:3.8.5
  • 木偶剂:3.7.2
  • apt: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的版本。 但是,这不会发生,没有重新安装/升级发生。 在(debugging)日志里面,没有什么值得显示的。

解:

如果这不是有意的:任何人都知道一个聪明的方法呢?

你的问题是,只有在软件包资源实际上正在安装你的软件包时,你的install_options才会被使用。 你有几个select:

  • 使用ensure => latest ,希望包更新(或自己触发一个) – 可能不是你想要的。
  • 升级到Puppet 4.x. 从版本4开始,Puppet拥有reinstall_on_refresh ,如果提供程序支持可reinstallable 安装 ,则允许重新安装notify事件。 虽然这在Debian上有效,但是这个选项可能不适用于你。
  • 捣蛋木偶认为包被卸载 – 这将需要在您的本地安装木偶补丁,不build议。
  • 具有重新安装function的补丁木偶:在几年前的这个错误报告中 ,Aggelos Economopoulos为某个版本的木偶提供了补丁 ,看起来相当简单。 这应该让你开始。 不过,我不build议修补你的木偶代理安装。
  • 重新安装它自己:也许你现在唯一的select:写下这些线:

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

    根据有和没有选项的软件包的不同,这可能是非常困难的。 如果只有less数的软件包受到影响,它可以被pipe理。

  • 编写你自己的提供程序,并将其添加到package ,或build立像package_reinstall :这是令人惊讶的简单,可以通过模块进行pipe理和版本化,并没有Puppet更新。 我build议从provider / package / apt.rb开始 。 毕竟这可能是你最好的select。

我相信ensure => installed将只确保安装,但它不会升级,如果有一个较新的版本。 使用latest的做到这一点。 如果有更新的版本,它也只会升级。 如果这是您希望比当前安装版本更早的首选版本,则必须find解决该问题的方法。 也许一个exec将检查当前安装的版本是否与该另一个repo中的版本不同,然后卸载它,然后让软件包资源安装正确的版本。

您将需要触发安装操作才能使install_options生效。 一个可能的解决方法是首先ensure => absent ,然后一旦包被移除,您可以ensure => presentensure => 1.2-8+deb8u1 ,随后的安装将ensure => 1.2-8+deb8u1 install_options

一段时间以来,我一直在使用APT pinning ,而且我认为这是最干净的解决scheme之一,特别是与unattended upgrades和/或常规的apt-get dist-upgrade