Debian
Puppet:如果已經安裝了特定的包,如何尊重 package() 的 install_options
如果有人為這個問題想一個更好的標題:請相應地更改它。
環境:
- 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
並希望更新包(或自己觸發) - 可能不是您想要的。- 升級到 Puppet 4.x。從版本 4 開始,Puppet 具有reinstall_on_refresh
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 更新即可工作。我建議從provider/package/apt.rb 開始。畢竟這可能是你最好的選擇。