yum-plugin-prioritiesのある環境で、priorityの低い別リポジトリにある同名パッケージを入れたい場合

#rhel

yum prioritiesプラグインの影響で、欲しいバージョンのパッケージがうまく入らなかったときの説明と対処法の話。

TL;DR

  • yum-plugin-prioritiesを入れていると、priorityの低い、別リポジトリの同一パッケージがどうも入らない
  • priorityの低いパッケージが必要なときはyum --nopluginsyum --disableplugin=prioritiesで無効化する

事情

問題の起きた環境はAmazon Linuxだったんですが、CentOSでも再現できるので、今回はCentOSとepelで説明しようと思います。 (あとコレにはまったのは@lamanotramaさんだったり…黒田さんブログ書いて)

※Amazon Linuxの場合は、確かamzn-updatesとかだったと思います

背景

その1. epelとpuppetlabsに同名のpuppetパッケージがある

epelリポジトリの説明は省略。 puppetlabsはPuppet Labsが提供しているyumリポジトリで、puppet関連パッケージが入っています。 そして、この2つのリポジトリにはpuppetという名前のパッケージがあります。

epelにはpuppet 2.7系が入っている:

puppetlabs-productsにはpuppet 3.7系が入っている:

その2. yum-plugin-prioritiesによってepelの優先順位が高くなっている

yum-plugin-prioritiesはその名の通りリポジトリの優先順位を設定するプラグインで、priority=NのNが小さいほど優先順位が高くなります。 最も低い優先順位(デフォルト値)はN=99らしいです1

今、以下のようにepel (N=10) > puppetlabs (N=99)という状況があるとします。

[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
priority=10

[puppetlabs-products]
name=Puppet Labs Products El 6 - $basearch
baseurl=http://yum.puppetlabs.com/el/6/products/$basearch
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs
enabled=1
gpgcheck=1

課題と解決

puppetlabsリポジトリのpuppetを入れたい

上記のような状態でyum install puppetを実行すると、当然epelのpuppetがインストールされます。

そして厄介なのが、yum install puppet-3.7.4とバージョン番号を入力しても、それを無視して、epel側のリポジトリが優先されてしまうことです。

バージョン番号を無視するのは仕様なのかバグなのかはよく分かっておりませんが、Amazon LinuxとCentOSで再現出来たので、そういう現象として捉える必要がありそうです。

yum-prioritiesを無視したい

以下のように、priorityの低いパッケージが必要なときは--noplugins--disableplugin=prioritiesでプラグインを無効化することが出来ます。

--disableplugin=plugin
      Run with one or more plugins disabled, the argument is a comma separated list of wildcards to match against plugin names.

--noplugins
      Run with all plugins disabled.
      Configuration Option: plugins

なので、puppet 3系が欲しい場合は、以下のようなコマンドを使うとなんとかなりました。

yum --noplugins install puppet-3.7.4
yum --disableplugin=priorities install puppet-3.7.4

おまけ

disablerepoenablerepoを組み合わせて無効化する方法も考えたんですが、無効化したリポジトリのパッケージを依存関係にもっているとインストールエラーを起こしてしまうので、一時的にプラグインの無効化するか、全てのリポジトリにpriorityを設定するのが無難かなーという感じです。