この質問のより良いタイトルを考えた場合:それに応じて変更してください。
環境:
問題:
特定のパッケージがすでにノードにインストールされています。たとえば、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で機能しますが、このオプションはおそらく使用できません。自分で再インストールします。おそらく今のところ唯一の選択肢です。次の行に沿って何かを書いてください。
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 から始めることをお勧めします。結局のところ、これが最善の選択肢かもしれません。
install_optionsを有効にするには、インストールアクションをトリガーする必要があります。考えられる回避策は、最初にensure => absent
、そしてパッケージが削除されたらensure => present
またはensure => 1.2-8+deb8u1
および後続のインストールはinstall_optionsを尊重します。
私は信じている ensure => installed
はインストールされていることを確認するだけですが、新しいバージョンがある場合はアップグレードされません。これを行うには、latest
を使用します。また、新しいバージョンがある場合にのみアップグレードされます。それが現在インストールされているバージョンよりも古い優先バージョンである場合は、それを回避する方法を見つける必要があります。おそらく、現在インストールされているバージョンが他のリポジトリのバージョンと異なるかどうかを確認し、異なる場合はアンインストールして、パッケージリソースに正しいバージョンをインストールさせるexec
です。
私はしばらくの間APT pinning
をかなり広範囲に使用しており、特にunattended upgrades
および/または通常のapt-get dist-upgrade
と組み合わせると、これが最もクリーンなソリューション(の1つ)であると信じています。