如果有人对这个问题想一个更好的标题:请相应地改变它。
环境:
问题:
节点上已经安装了一个特定的软件包,让我们以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 ,希望包更新(或自己触发一个) – 可能不是你想要的。 reinstallable 安装 ,则允许重新安装notify事件。 虽然这在Debian上有效,但是这个选项可能不适用于你。 重新安装它自己:也许你现在唯一的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 => present或ensure => 1.2-8+deb8u1 ,随后的安装将ensure => 1.2-8+deb8u1 install_options 。
一段时间以来,我一直在使用APT pinning ,而且我认为这是最干净的解决scheme之一,特别是与unattended upgrades和/或常规的apt-get dist-upgrade 。