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を設定するのが無難かなーという感じです。