Debian

Puppet:如果已經安裝了特定的包,如何尊重 package() 的 install_options

  • June 2, 2017

如果有人為這個問題想一個更好的標題:請相應地更改它。

環境:

  • 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_refreshnotify,如果提供程序支持,它允許重新安裝事件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 開始。畢竟這可能是你最好的選擇。

引用自:https://serverfault.com/questions/800727