三鷹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ラッパ」ってイメージが強くなりました。