yum prioritiesプラグインの影響で、欲しいバージョンのパッケージがうまく入らなかったときの説明と対処法の話。
TL;DR
yum-plugin-priorities
を入れていると、priorityの低い、別リポジトリの同一パッケージがどうも入らない- priorityの低いパッケージが必要なときは
yum --noplugins
かyum --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
おまけ
disablerepo
とenablerepo
を組み合わせて無効化する方法も考えたんですが、無効化したリポジトリのパッケージを依存関係にもっているとインストールエラーを起こしてしまうので、一時的にプラグインの無効化するか、全てのリポジトリにpriorityを設定するのが無難かなーという感じです。