初級情報インフラ管理者の技術メモ

ほぼ自分用の技術メモです。

opscode-cookbooks/vimのコミュニティクックブックでVim 7.4をインストールしようとしてハマったメモ

chefが提供している、vimをインストールするコミュニティクックブックを使って、Vagrant上のCentOS 6.6にchefでVim 7.4をソースからインストールしようとしたらハマってしまったので、メモしときます。

まずBerksfileを次のとおり編集します。

source "https://supermarket.chef.io"
(中略)
cookbook ['vim']

コミュニティクックブックをberks vendorコマンドでインポートします。

$ bundle exec berks vendor ./cookbooks

この状態でvagrant provsionすると、yumvim-enhancedが正常にインストールされます。しかし、CentOS 6のyumでインストールするVimRubyに対応していないので、ソースからコンパイルしてVim 7.4をインストールしようと思いました。

インポートしたコミュニティクックブックのREADME.mdを読むと次のように書いてあります。

If you would rather compile vim from source, as the case may be for centos nodes, then override the node['vim']['install_method'] with a value of 'source'.

そこで./cookbooks/vim/attributes/default.rbを次のように変更します。

(省略)
default['vim']['install_method'] = 'source'

そしてvagrant provisionを実行すると、次のようなエラーが出力されてプロビジョンが失敗します。

==> default: [2014-12-07T03:29:33+09:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> default: [2014-12-07T03:29:33+09:00] ERROR: remote_file[/var/chef/cache/vim-7.4.tar.bz2] (vim::source line 29) had an error: Chef::Exceptions::ChecksumMismatch: Checksum on resource (607e13) does not match checksum on content (d0f5a6)
==> default: [2014-12-07T03:29:33+09:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)

チェックサムが合わないとのことなので、Vimの配布元でMD5SUMの値を確認します。

607e135c559be642f210094ad023dc65 vim-7.4.tar.bz2

./cookbooks/vim/recipes/source.rbの内容を確認します。

(省略)
remote_file "#{cache_path}/vim-#{source_version}.tar.bz2" do
  source "http://ftp.vim.org/pub/vim/unix/vim-#{source_version}.tar.bz2"
  checksum node['vim']['source']['checksum']
  notifies :run, "bash[install_vim]", :immediately
end
(省略)

このレシピではVimのソースファイルのチェックサムを確認するようになっています。ということはダウンロードしようとするファイルのチェックサムと、レシピに記載したチェックサム値が合っていないからプロビジョンに失敗したと思われます。そこで、./cookbooks/vim/attributes/source.rbの内容と比較してみます。

(省略)

default['vim']['source']['checksum']      = '607e135c559be642f210094ad023dc65'
(省略)

合っている……。

しばらく悩みながら調べてみると、やっと原因が分かりました。

chefのドキュメントを読むと、remote_fileのchecksumはMD5ではなく、sha256で比較しているとのことでした。

checksum Optional, see use_conditional_get. The SHA-256 checksum of the file. Use to prevent the remote_file resource from re-downloading a file. When the local file matches the checksum, the chef-client will not download it.

そりゃエラーになるわけです。Vimの配布元にはsha256の値は公開されていないため、自分で調べる必要があります。

$ wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
$ shasum -a 256 vim-7.4.tar.bz2
d0f5a6d2c439f02d97fa21bd9121f4c5abb1f6cd8b5a79d3ca82867495734ade

./cookbooks/vim/attributes/source.rbのdefault['vim']['source']['checksum']の値をsha256の値に変更します。

$ sed -i -e 's/607e135c559be642f210094ad023dc65/d0f5a6d2c439f02d97fa21bd9121f4c5abb1f6cd8b5a79d3ca82867495734ade/' ./cookbooks/vim/attributes/source.rb

これでvagrant provisionが成功するようになります。

しかしなぜchefの公開しているレシピなのにdefault['vim']['source']['checksum']にMD5の値を書いているのだろう。もしかしてMD5でチェックするオプションがあるんでしょうか?