如果有人为这个问题想一个更好的标题:请相应地更改它。
环境:
- Debian 杰西 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
. 但是,这不会发生,不会发生重新安装/升级。在(调试)日志中,没有什么值得显示的。
解决方案:
如果这不是故意的:有人知道解决这个问题的聪明方法吗?
你的问题是,只有在包资源实际安装
install_options
你的包时才会使用你的。你有几个选择:ensure => latest
并希望更新包(或自己触发) - 可能不是您想要的。notify
,如果提供程序支持,它允许重新安装事件reinstallable
。虽然这适用于 Debian,但此选项可能对您不可用。自己重新安装:可能是您现在唯一的选择:按照以下方式写一些东西:
根据带有和不带有选项的软件包的差异,这可能是任意困难的。如果只有少数软件包受到影响,它是可以管理的。
编写您自己的提供程序并将其添加到
package
,或建立类似的东西package_reinstall
:它非常简单,可以通过模块进行管理和版本控制,并且无需 Puppet 更新即可工作。我建议从provider/package/apt.rb 开始。毕竟这可能是你最好的选择。我相信
ensure => installed
只会确保它已安装,但如果有更新版本,它不会升级。用来latest
做那个。如果有更新的版本,它也只会升级。如果这是您想要的比当前安装的版本旧的首选版本,您将必须找到一种解决方法。也许exec
会检查当前安装的版本是否与其他 repo 中的版本不同,如果是则卸载,然后让包资源安装正确的版本。您需要触发安装操作才能使install_options生效。一种可能的解决方法是首先
ensure => absent
,然后一旦软件包被删除,您就可以ensure => present
或者ensure => 1.2-8+deb8u1
随后的安装将遵循install_options。一段时间以来,我一直在
APT pinning
广泛使用,我相信这是(其中)最干净的解决方案,尤其是与unattended upgrades
和/或常规的apt-get dist-upgrade
.