読者です 読者をやめる 読者になる 読者になる

Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

何もいじってないのに急にVagrantのprovisionのchef-solo実行がエラーになった

Vagrant Chef Solo

久々にvagrant provisionしてみたらエラーでうまくプロヴィジョニングできず えいやーでvagrant destroyしてvagrant upし直してみてもうまくいかなくて 何もいじってないのになんでだよおおおってなることありませんか?あります。はい。 役立つことは少なそうですがせっかくなので対処したケースを載せておきます。

今回使っていたVirtualBoxのboxファイルはVagrantbox.esに載っているCentOS6.4 x86_64の以下のものです。

https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box

Vagrantって結構バグ踏むことが多いので、ハマりそうになると VagrantアップデートしてみようとかVirtualBoxアップデートしてみようとか 結構安易な対処法でも効くことがあります。 今回はアップデートをしてもboxファイルを取得し直してみても解決できず どうしたもんかなちゃんと調べるか、と重い腰を上げることにしました。

問題のエラーですが、vagrant up実行時のchef-soloのあるレシピが失敗しています。

Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

さかのぼって詳細をみてみると

==> default: ---> Package systemtap-devel.x86_64 0:2.7-2.el6 will be installed                                 │
==> default: --> Processing Dependency: kernel-devel for package: systemtap-devel-2.7-2.el6.x86_64             │
==> default: --> Finished Dependency Resolution                                                                │
==> default:  You could try using --skip-broken to work around the problem                                     │
==> default:  You could try running: rpm -Va --nofiles --nodigest                                              │
==> default: STDERR: Error: Package: systemtap-devel-2.7-2.el6.x86_64 (base)                                   │
==> default:            Requires: kernel-devel                                                                 │
==> default: ---- End output of yum -y groupinstall "Development Tools" ----                                   │
==> default: Ran yum -y groupinstall "Development Tools" returned 1                                            │

"Development Tools"のインストールを行うレシピがあるのですが、そこでエラーとなっています。 どうやら依存しているkernel-develがインストールできないようです。 試しに単体でインストールしてみると

$ yum install kernel-devel
Loaded plugins: fastestmirror, versionlock
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * epel: mirror01.idc.hinet.net
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
Setting up Install Process
No package kernel-devel available.
Error: Nothing to do

へーーー、ないんだwwちょwww困ります。 困ったときはグーグル先生に聞きます。 kernel-develではなくkernelの方は2.6.32-358.23.2.el6がインストール済みだったので どうやらkernel-devel-2.6.32-358.23.2.el6.x86_64を手に入れる必要があるようです。 kernel-devel-`uname -r`ってことですね。 探してみるとcentosplusのリポジトリには存在しているようです。 http://vault.centos.org/6.4/centosplus/x86_64/Packages/kernel-devel-2.6.32-358.23.2.el6.centos.plus.x86_64.rpm

なぜこのバージョンが参照できないのか。最新版を探してみると http://mirror.centos.org/centos/6/os/x86_64/Packages/kernel-devel-2.6.32-573.el6.x86_64.rpm これが最新版のようで、日付を見れば24-Jul-2015 20:41になっています。

f:id:innossh:20150826224942p:plain

ふむふむ。せっかくなので追ってみましょう。 redhatのサイトをたどると

f:id:innossh:20150826224959p:plain

File outdated by: RHSA-2015:1623 になってますね。

f:id:innossh:20150826225002p:plain

2015-08-13に更新されたようです。納得。

というわけで、前回いじっていたころから久々に起動するまでの間に kernel-develに脆弱性が見つかって古いバージョンのものがcentosリポジトリから消滅してしまったので 何もいじってないのにchef-soloの実行がエラーになってしまったというわけでした。 最終的にどう対処したかというと、今回はローカルで使う開発用のvmvagrant shareするわけでもないので Development Toolsのインストールの前に、古い方のrpmをダウンロードしてきてインストールするようにしました。 あまりきれいな対処法ではないけれど。

remote_file "/tmp/#{node['kernel-devel']['rpm_file']}" do
  source "#{node['kernel-devel']['rpm_url']}"
end

package "kernel-devel" do
  action :install
  source "/tmp/#{node['kernel-devel']['rpm_file']}"
end