librarian-chef から berkshelf に引っ越した

長らく librarian-chef を使っていたのだけど、id:shimizukawavagrant-berkshelf プラグインがWindowsでエラーになる を読んで
もう berkshelf に乗り換えるべきか…と思って重い腰を上げて引越し作業をしてました。

librarian-chef は僕が chef に触り始めた当初から使っていたので、もう 2年ぐらいの付き合いになるんだと思いますがここでお別れです。
berkshelf と機能差はないからどっちでもいいよねーとは思っていましたが、naoya 本の影響もあって多くの人が berkshelf 使ってますし、
更新の度合いもかなり差がある状態ですから、今使うのであれば berkshelf という気がします。よく調べてないけど。

というわけで、既に librarian-chef で作った環境に悪影響がないよう、いくつかのステップを踏んで引っ越ししました。

使っている cookbook を最新版にしておく

berkshelf に引っ越すにあたって、一番最初の作業として、使っている cookbook を最新版にアップデートしました。
Berksfile にすべての cookbook のバージョンを書いていくという選択肢も一応ありましたが、
見通しが悪って辛いだけだろうということでこの機会にアップデートをかけました。

やることは librarian-chef update して、実際に環境を構築し直すだけです。

実際にやってみて影響があったところをピックアップしておきます。

  • selinux 0.6.0 はバグがあって動作しない
    • 対策: 次バージョンが出るまでは '~> 0.5.0' と指定しておくこと。PR も存在する。
  • postfix 3.0.2 はバグがあって動作しない
    • 対策: 次バージョンが出るまでは '~> 2.0' と指定しておくこと。PR も存在する。
  • jenkins の 1.x 系がリリースされた。大幅に書き換えが発生しているので設定変更が必要。
    • jenkins レシピではなく jenkins::server レシピを使うこと
    • nginx など、フロントエンドサーバを使う場合は jenkins::proxy レシピを使う必要がある

偶然、jenkins 1.x 系はリリースされる前から触っていたので、適当にいじるだけで対処できました。

berkshelf をインストールする

Gemfile を書き換え。省略。

Berksfile を作る

Cheffile とほとんど書式が変わらないので、だいたいコピペで動きました。
違いがあったのは次の 2点。

  • 同じ cookbook を 2回指定するとエラーになる (別のグループだと ok)
  • git branch の指定方法が異なる。:ref (librarian-chef) から :tag (berkshelf) に書き換えた。
  • ひとつのリポジトリに複数の cookbook が入っているような環境では :rel オプションでパス指定が必要。

リファレンスを読むとグルーピングする機能が存在したので、
書き換えるときにロールごとにグループを作るようにしてみました。
幸せになれるかどうかは自信がないので、ここはやり方を模索するつもり。

# centos_basic role
group :centos_basic do
  cookbook 'selinux', '~> 0.5.0'  # 0.6.0 has bug: [COOK-3882] uninitialized constant Chef::Resource::Selinux
  cookbook 'sudo'
  cookbook 'user'
  cookbook 'yum'
  cookbook 'zsh'
end

# devtools role
group :devtools do
  cookbook 'python'
  cookbook 'buildout-cache',
    :git => 'git@github.com:tk0miya/chef-buildout-cache.git'
  cookbook 'mercurial'
  cookbook 'screen'
  cookbook 'vim'
  cookbook 'zsh'
end

書き換えた後、念のため librarian-chef でダウンロードしたものと berkshelf でダウンロードしたものを比較しておきました。

$ diff -ru config/cookbooks berkshelf_test/cookbooks

なぜか berkshelf で古い cookbook を拾ってしまうというトラブルがあった*1ものの、
librarian-chef と同じものをダウンロードしていることを確認しました。

diff の結果を捨ててしまったのですが、.git や .gitignore、.travis.yml などのドットファイルがいくつか差分として出ていました (berkshelf ではこれらのファイルを含んでいない)。

berkshelf の方で環境を構築してみる

やりました。特に問題なかったのでこれも省略。

capistrano-paratrooper-chef をアップデートした

これまで、librarian-chef の実行と chef-solo の実行を capistrano-paratrooper-chef にまかせていたので、
berkshelf に引っ越しをしてもそのまま使えるように paratrooper-chef を 0.3.0 にアップデートしました

capistrano-paratrooper-chef 0.3.0 を使うと

  • capistrano を使ってリモートホストで chef-solo を実行してくれる (並列実行可)
  • Berksfile を置いておくと berkshelf で cookbook を収集してリモートホストに転送してくれる [NEW!]
  • これまでどおり librarian-chef も使える

などができます。

後悔していること

時間が取れないので、いまだに serverspec のテストを書いていないので、
動作を確認するのがすごく面倒です。
diff 取ったりしていますが、テストコードで担保したほうが幸せですよね、たぶん。

*1:調べてみたが原因はわからず。~/.berkshelf と Berksfile*、出力先ディレクトリを消すことで解決した