要件
- 以前に書いた 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 でこのネタ話してみよかな(汗