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 も歓迎です)
ぜひみなさんも capistrano-platform-recognizer を使って、ハッピーな capistrano life を送ってください。cap yeah!