三鷹PGcafeでcapistranoの話を聞いた
今更だけどやっぱり書いておこう。せっかくだしね。
毎週木曜日に開かれている三鷹プログラマーズカフェで、id:oneringことysakakiさんによるCapistranoの話を聞いてきました。
Capistranoは2年ぐらい前にちょっと触ったことがある程度で、あんまり細かいことは憶えてなかったので、そのへんの記憶をたどりながら話を聞いてました。
当時、導入しなかったのは「Capistranoを覚えて自分でレシピを書く」ことがシェルスクリプトを書くのに対して明確なアドバンテージがあるように思えなかったことが一つ。もう一つは、複数のサーバに対してタスクを実行する時に、全て並列に処理されるため、コンソールのログが混ざって判別不能になることでした。
で、Twitterに軽くつぶやいてたら後者のコンソールログの問題については「それmax_hostsでできるよ」とyandoさんが教えてくれたので、解消できそう。これは期待が持てる。軽くググった感じでは、以前試した時はまだサポートされてなかったっぽい。
MacPortsから新しいのを引っ張って来てもよかったんだけど、何かcapコマンド叩いたら動いたので、それをそのまま使うことに。入ってたのがv2.0.0で、Portsの最新版が2.5.3だから新しいの入れた方がよさそうな気もしたけど、その場ですぐ試したかったのでそのまま。
RailsというかRuby自体使っていないので、適当なプロジェクトのホームで
capify .
して初期設定。configってディレクトリが無いと怒られたので、作ってもう一度実行。Capfileとconfig/deploy.rbが出来て準備完了。
CapfileがmakeでいうMakefileみたいなもの? で、deploy.rbがcapistranoの挙動を制御する「レシピ」。
初期状態のCapfileはこんなの。
load 'deploy' if respond_to?(:namespace) # cap2 differentiator load 'config/deploy'
'config/deploy' はさっきのcapifyで出来たファイルで、'deploy' がCapistrano本体に含まれるレシピっぽい。
config/deploy.rbはテンプレートになっていて、これをカスタマイズして適宜実行するらしい。
- setで環境設定
- roleでロール(実行対象のホストグループ)を定義
- taskで実行する内容を定義
というのがレシピの基本構造。タスクは「hoge:fuga」みたいにnamespace付きで設定できて、
namespace :hoge do desc <<-DESC test hoge DESC task :default, :roles => :app do run <<-CMD hostname; CMD end end
とか書くと、「cap hoge」でhoge:defaultが実行される。そんなに難しいもんじゃない。基本が分かればサクサク書けそう。
taskには実行時のオプションがあれこれ指定出来て、前述のmax_hostsもここで設定するらしい。
task :default, :max_hosts => 1 do
とか書けば、1サーバずつ順番に処理してくれるので安心。タスク単位の設定なので、一括実行するタスクと個別実行するタスクを用意して、それを順に実行するタスクを更に用意するとかで、自由に制御できそう。
実は一番困ったのがMacBookからCentOSのサーバに接続に行く時のSSHの設定。どうやらクライアントマシンのSSH設定を前提としてアクセスするらしく(接続先の情報が無いから当然っちゃ当然)、ホームディレクトリの仕様が違ったりするとログインに失敗します。ググってみたら、
set :ssh_options, :keys => [ "~/.ssh/authorized_keys" ]
てな具合に、ssh_optionsを設定してやればいけることが判明。このへんは、RubyのNet::SSHモジュールの仕様らしい。Rubyの知識があればすぐに分かるんだろうな。
あとは、Capistrano本体のレシピがかなり参考になる。
簡単なコマンドを実行するだけならさして難しいことは無いので、結構気軽に使えそうです。「高機能なデプロイツール」というより「手軽に使えるSSHラッパ」ってイメージが強くなりました。