capistrano で OS/distro ごとに実行タスクを切り替える

capistrano で、ある OS/distro のときだけこれを実行したい、ということがある。
主に依存パッケージを入れるときなど。
こっちのサーバは CentOS 5.x だから〜〜パッケージを入れたいのだけど、
こっちのサーバは CentOS 6.x だからパッケージ名が変わっててねえ、みたいなケース。

ひとつのプロジェクトで OS が混在するというのは稀なんだけれど、
Capistrano のスクリプトを共有していこうと思うと話が変わってくる。
あっちの仕事で作ったのを持ってきても、こっちの仕事では OS が変わるので使えないのだ。

role 宣言をするときに、あれこれ設定を書いてあげるのもいいのだけれど、それもちょっと面倒なのよね…という人(主に僕)のために
capistrano-platform-recognizer というモジュールを作ってみた。

capistrano-platform-recognizer

大事なことなので無駄にセクションを作って二回書きました。

前述通り、このモジュールは capistrano の OS や distro の情報で実行タスクを切り替えるために作られました。
百聞は一見に如かず、いきなり使ってみましょう。

require 'capistrano-platform-recognizer'

desc "install autoconf-2.6x (CentOS 5 only)"
task(:install_deps, :only => {:distro => :centos5}, :on_no_matching_servers => :continue) do
  run <<-EOF
    cd /tmp;
    curl -O http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/autoconf26x-2.63-4.ius.el5.noarch.rpm;
    #{sudo} rpm -ivh autoconf26x-2.63-4.ius.el5.noarch.rpm;
    rm -f autoconf26x-2.63-4.ius.el5.noarch.rpm
  EOF
end

タスク定義のところに :only => {:distro => :centos5} と書かれている通り、
このタスクは CentOS 5 のサーバでしか実行されません。*1

どういう属性が設定されるの?

今日リリースした 0.0.1 では :osname, :distro, :arch の 3種類の属性が取得出来ます。

:osname は uname -s で取得した値が入ります。

distro は /etc/issue の内容を見て
centos5, :centos6, :amazon などの判定をします。

ただし、僕がアクセスできるいくつかの環境の情報しか入っていないので、まだまだ不足しています。
github issues に要望を上げていただければ対応しますので、どんどんリクエストしてください。(pull request も歓迎です)

arch は uname -m の結果から、
i386 か :x86_64 かを取得するものです。


ぜひみなさんも capistrano-platform-recognizer を使って、ハッピーな capistrano life を送ってください。cap yeah!

*1:この例は ruby1.9.3 をビルドするために autoconf 2.6x 系を入れてるサンプルです