Capistranoの例

On 2011年9月17日, in Capistrano, Ruby, by タカ

目次


前職ではこんな感じにしていたなぁというネタ。

下書き状態で残っていてもったいなかったので公開。

ディレクトリ構成

以下のようなディレクトリ構成

$CAP_HOME
- Capfile => config配下のXXX.rbをloadする
- config
  - deploy.rb
  - deploy
    - production.rb => 本番用環境情報
    - test.rb => テスト用環境情報
  - XXX.rb => 各種レシピ

deploy.rbは以下の通り。

require 'capistrano/ext/multistage'

set :default_run_options, :max_hosts => 20
set :user, 'cap'
ssh_options[:keys] = '/home/user/.ssh/id_rsa'
  • 同時20サーバで実行
  • 実行ユーザはcap
  • sshの秘密鍵は /home/user/.ssh/id_rsa

環境設定

$CAP_HOME/config/deploy/XXX.rb に設置。

server 'srv1.example.com', :web
server 'srv2.example.com', :web
server 'srv3.example.com', :web, :ap
server 'db1.example.com', :db
server 'db2.example.com', :db

みたいな形で、1サーバずつロールを設定。

レシピ

namespaceを使ってある程度グルーピングする。

namespace :group do
  task :task1, :roles => :web do
    ここでごにょごにょする
  end

  task :task2, :roles => :db do
    ここでごにょごにょする
  end
end

といった形。

$ cap production group:task1

とか

$ cap test group:task1

のように呼び出す。

引数を受け取る

たまに、外部から引数を受け取りたい時がある。

例えば、Capistrano実行サーバにあるファイルを各サーバへscpしたい時は、

namespace :fileup do
  task :upload_txt, :roles => :web do
    upload filename, '/tmp', :via => :scp
  end
end

というレシピを書いて、

$ cap test -S filename=/tmp/text.txt fileup:upload_txt

と呼び出す。

シェルスクリプトからCapistranoを呼ぶ

cronなどにシェルを登録して、内部でCapistranoを実行したい。

そんな時の例。

#!/bin/sh
CAP_HOME="/home/user/cap"
CAP="/usr/local/bin/ruby /usr/local/bin/cap"

cd $CAP_HOME
$CAP production group:task1
Tagged with: