Help us understand the problem. What is going on with this article?

Capistrano

More than 3 years have passed since last update.

パーフェクトRubyにおけるCapistranoをまとめた
パーフェクトRubyだとcapstrano 2.x系で説明している。
2015/10/24現在だとcapistrano 3.4.0が最新で、若干コマンドが異なる

Capistranoとは

複数のサーバを操作する時に使えるツール。
コマンド一つでアプリケーションを構築することが可能
複数のリモートサーバに対して処理を行うことができるのでデプロイツールでもある。Rubyで記述されている。
ただし、POSIX準拠のシェルを備えたサーバに限定される

POSIX準拠のシェルとは
IEEEが定めたUNIXベースのOSが備えるべき最低限の仕様
(プロセス制御、権限管理、ファイル、ディレクトリなど多岐にわたる)

ChefやAnsible, Dockerとの違い

Chef: サーバの状態を管理する(ミドルウェアのインストールなど)
Capistrano: アプリケーションコードやDBのテーブル定義など

運用イメージ

 複数のサーバに対して、git-hub等のリポジトリからソースコードを
 各サーバに反映するとか

最初にやること

  • gem install capistrano
    • 以下のコマンドが利用できるようになる
    • capifyコマンド...設定ファイルの雛形を作るコマンド
    • capコマンド...設定ファイルの読み込みをするコマンド

capifyコマンドを実行すると以下のファイルが作られる

  • Capfile
    • タスクが記述されたファイルを読み込むのに必要なファイル
  • config/deploy.rb
    • デプロイの流れを記述するファイル
    • デフォルトでも十分な機能はあるが、このdeploy.rbに拡追記すれば拡張もできる
    • このデプロイをまとめたものを「デプロイレシピ」と呼ぶ

デプロイレシピの書き方

deploy.rbの以下メソッドについて説明する。

  • set
  • role
  • task

set

Capistranoのオプションを設定するのにsetを使う

オプションとは

ここでいうオプションは、リポジトリの指定やバージョン管理システムの指定、Capistrano内のローカル変数などのこと。これらを設定していくのがsetコマンド。

使い方

setコマンドの第一引数にオプションとなるシンボルを、
第二引数に値を渡す。

# デプロイを行うのに「application」「repository」「scm」はの指定は必須
set :application, "hoge_project"
set :repository, "git://hoge.git"
set :scm, "git"
set :use_sudo, true // sudo 権限で実行する

# ローカル変数の指定
:set :local_val, "val"
# puts で中身を確認できる
puts local_val # => "val"

role

デプロイするサーバを用途別にグルーピングするための設定
Capifyコマンドで作成した雛形ファイルには、
「web」「app」「db」がデフォルトで設定されている

使い方

第一引数にグループを、
第二引数に値を渡す。

role :web, "hoge-web-server"
role :app, "hoge-app-server"
role :db, "hoge-db-maser", :primary => true
role :db, "hoge-web-slave"

set :deploy_to , "/var/www/html/hoge/#{application}/"

task

taskは実際に処理を記載したもの
Rakeと同じで

cap タスク名

でタスクごとに実行ができる

desc "This is a hoge task."
task :hello_capistrano do
  run 'echo "Hello Capistrano"'
end

Rakeと同じように以下のコマンドで、
タスク内容が表示される

cap -T # Rakeのタスクの確認と同じ

taskメソッドの第二引数に:rolesを渡すと、
実行するサーバを指定できる

rolesを渡す
desc "exec at web and app server"
task :hellocapistrano, :roles => [:web, :app] do
  run 'echo "Hello, web and app server"'
end

デプロイの流れ

実際にどのようにCapistranoがデプロイしていくかを確認する
Capistranoにはあらかじめ利用できるタスクが存在する(P.476参照)
Webアプリケーション(Ruby on Rails)向けのdeployタスクがあるのでそれを利用する。
deployタスクを実行する前にセットアップタスク(タスク名deploy:setup)を実行しないといけない。

deploy:setup

deploy:setupコマンドが実行するのは、
setメソッドでdeploy_toを指定し、デプロイ先のディレクトリを設定していたが、そのディレクトリに「releases」と「shared」というディレクトリを作成する。

Capistranoが利用するディレクトリはこの「releases」と「shared」と「current」の3つのディレクトリを利用する。

releases
  • デプロイされるプログラム一式。 デプロイ毎にディレクトリが作成される。
shared
  • アプリケーションの出力ログ
  • tmpディレクトリ
  • pidファイルへのシンボリックリンク
current
  • 現在アプリケーションとして稼働しているプログラム一式(releasesディレクトリ以下のデプロイされたシンボリックリンク)
  • deployタスク実行時に生成される。

で、デプロイの流れの話に戻ると、
大きく分けると以下のようになる。
(1) ソースコードの取得
(2) bundle install
(3) 共有ファイルのシンボリックリンク差し替え
(4) 最新版ディレクトリ(current)のシンボリックリンクの差し替え
(5) サーバ再起動

タスク実施時の出力内容の制御

cap -vで出力内容を制御できる。
詳細出力を確認したい場合はcap -vvvを使う

transactionとrollback

Capistranoにはトランザクションとロールバック機能がある
transactionメソッドのブロック内に on_rollbackメソッドを記述

desc 'rollback test'
task :has_error, :roles => :app do
  transaction do
  on_rollback { rub 'echo "has error"' #ロールバック処理}
  run 'command_does_not_exists "error?"'
end 

エラーが発生した場合on_rollback内の処理が実行される。

パスワードの取り扱い

デプロイ処理によってはパスワードが必要な時がある。
デプロイレシピにパスワードを直接書くのはセキュリティ上よくないので、パスワードを入力するインターフェイスを提供することで回避する。

使い方

Capistrano::CLI.password_promptメソッドを使う

set(:db_passwd) { Capistrano::CLI.password_prompt("DB Password:") }

desc "db connect"
task :db_connect, :roles => db {
  run "db_connect --user=pruby --password=#{db_passwd}"
}

CaptureとStream

サーバからのレスポンスを受け取ることができる。
ログの収集などに使われる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした