如果有人对这个问题想到一个更好的标题:请相应地进行更改。
环境:
- 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 => present
或ensure => 1.2-8+deb8u1
,并且后续安装将遵守安装选项。
答案4
我使用APT pinning
它已经有一段时间了,我相信这是最干净的解决方案(之一),特别是与unattended upgrades
和/或常规结合使用时apt-get dist-upgrade
。