ようへいの日々精進XP

よかろうもん

自作のどうしようもない chef レシピをリファクタリングする一部始終(1)

要件

  • 以前に書いた rpmforge リポジトリインストールのレシピを別な書き方で解決する

レッツリファクタリング

以前のレシピ

以下のような感じで RPM ファイルを cookbook の file 以下にダウロードしておいて、cookbook_file を使って対象ノードにコピーしてから rpm コマンドでインストールしていた...

  • 問題点
    • RPM ファイルを手動でダウンロードしておかなければいけない
# rpmforge リポジトリのインストール
rpmforgefile="rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm"
cookbook_file "/tmp/#{rpmforgefile}" do
        mode 0644
        checksum "2df746e6fa066607c3a177578472f6dbb1a7fc6b8e53b79a2373d6ce9774da17"
end
package "rpmforge" do
        action :install
        source "/tmp/#{rpmforgefile}"
        provider Chef::Provider::Package::Rpm
end

直したレシピ

解決策として、当初は http_request を使おうと思って調査していたが、http_request して GET してきたファイルを保存するオプションが確認できなかったので半ば諦めて状態でいたところ remote_file が使えそうだったので試してみたらイケた。

remote_file "/tmp/rpmforge-release-0.5.2-2.el6.rf.i686.rpm" do
        source "http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm"
end

package "rpmforge" do
        action :install
        source "/tmp/rpmforge-release-0.5.2-2.el6.rf.i686.rpm"
        provider Chef::Provider::Package::Rpm
end

改善ポイント

  • あらかじめファイルをダウンロードしておく必要は無くなった
  • 但し...まだ残る問題点
    • cookbook_file の時と同様にバージョン管理や OS のアーキテクチャ(32bit or 64 bit)の違いに伴うファイル名管理方法を検討する必要がある

まとめ

  • ファイルをあらかじめダウンロードして管理しなければいけない呪縛から解き放たれて良かった
  • 課題として、以下の点についてレシピの追加が必要になる
    • 最新のファイルを取得するロジック
    • ダウンロードに失敗した際のロジック
  • とりあえず、来週の Chef Casual Talk Vol.1 でこのネタ話してみよかな(汗