web-dev-qa-db-ja.com

Puppet:特定のパッケージがすでにインストールされている場合にpackage()のinstall_optionsを尊重する方法

この質問のより良いタイトルを考えた場合:それに応じて変更してください。

環境:

  • Debian jessie 8.5
  • 操り人形マスター:3.8.5
  • 人形エージェント:3.7.2
  • apt: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のバージョンにアップグレードされることを期待します。ただし、これは発生せず、再インストール/アップグレードは発生しません。 (デバッグ)ログ内には、これに関して表示する価値のあるものは何もありません。

解決策:

これが意図されていない場合:誰かがこれを回避する賢い方法を知っていますか?

3
gf_

問題は、install_optionsが使用されるのは、パッケージリソースが実際にパッケージをインストールしている場合のみであるということです。いくつかのオプションがあります。

  • ensure => latestを使用して、パッケージの更新を期待します(または自分でトリガーします)-おそらくあなたが望むものではありません。
  • Puppet4.xへのアップグレード。バージョン4以降、Puppetには reinstall_on_refresh があり、プロバイダーがnotifyをサポートしている場合、reinstallableイベントでの再インストールが可能です。これはDebianで機能しますが、このオプションはおそらく使用できません。
  • Puppetをだまして、パッケージがアンインストールされていると思い込ませます。これには、ローカルインストールにpuppetパッチが必要ですが、お勧めしません。
  • 再インストール機能を備えたパッチPuppet: このバグレポート 数年前から、Aggelos Economopoulosは パッチ 一部のバージョンの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 から始めることをお勧めします。結局のところ、これが最善の選択肢かもしれません。

2
M. Glatki

install_optionsを有効にするには、インストールアクションをトリガーする必要があります。考えられる回避策は、最初にensure => absent、そしてパッケージが削除されたらensure => presentまたはensure => 1.2-8+deb8u1および後続のインストールはinstall_optionsを尊重します。

0
Jesusaur

私は信じている ensure => installedはインストールされていることを確認するだけですが、新しいバージョンがある場合はアップグレードされません。これを行うには、latestを使用します。また、新しいバージョンがある場合にのみアップグレードされます。それが現在インストールされているバージョンよりも古い優先バージョンである場合は、それを回避する方法を見つける必要があります。おそらく、現在インストールされているバージョンが他のリポジトリのバージョンと異なるかどうかを確認し、異なる場合はアンインストールして、パッケージリソースに正しいバージョンをインストールさせるexecです。

0
lsd

私はしばらくの間APT pinningをかなり広範囲に使用しており、特にunattended upgradesおよび/または通常のapt-get dist-upgradeと組み合わせると、これが最もクリーンなソリューション(の1つ)であると信じています。

0
gf_