読者です 読者をやめる 読者になる 読者になる

garbagetown

個人の日記です

capistrano

rails

ヒマ潰しと現実逃避を兼ねて capistrano を触ってみました。環境は下記の通り。

rails も git も ssh もよく分かっていないため、なにか起こっても何が悪いのかさっぱり分からず、限りある時間をまたもや盛大に無駄遣いしてしまったので、例えゴミだ駄文だと罵られようとも、せめてこの世に足掻いた証のひとつやふたつ、ひっそりと残して散りたいのです。

capistrano のインストール

まずは capistrano のインストール。開発環境で gem install を叩くだけ。

% gem install capistrano
Successfully installed net-ssh-2.0.11
Successfully installed net-sftp-2.0.2
Successfully installed net-scp-1.0.2
Successfully installed net-ssh-gateway-1.0.1
Successfully installed highline-1.5.0
Successfully installed capistrano-2.5.5
6 gems installed
(snip)

% cap --version
Capistrano v2.5.5

cap -T でコマンドの一覧を確認できます。

% cap -T
cap deploy               # Deploys your project.
cap deploy:check         # Test deployment dependencies.
cap deploy:cleanup       # Clean up old releases.
cap deploy:cold          # Deploys and starts a `cold' application.
cap deploy:migrate       # Run the migrate rake task.
cap deploy:migrations    # Deploy and run pending migrations.
cap deploy:pending       # Displays the commits since your last deploy.
cap deploy:pending:diff  # Displays the `diff' since your last deploy.
cap deploy:restart       # Restarts your application.
cap deploy:rollback      # Rolls back to a previous version and restarts.
cap deploy:rollback:code # Rolls back to the previously deployed version.
cap deploy:setup         # Prepares one or more servers for deployment.
cap deploy:start         # Start the application servers.
cap deploy:stop          # Stop the application servers.
cap deploy:symlink       # Updates the symlink to the most recently deployed ...
cap deploy:update        # Copies your project and updates the symlink.
cap deploy:update_code   # Copies your project to the remote servers.
cap deploy:upload        # Copy files to the currently deployed version.
cap deploy:web:disable   # Present a maintenance page to visitors.
cap deploy:web:enable    # Makes the application web-accessible again.
cap invoke               # Invoke a single command on the remote servers.
cap shell                # Begin an interactive Capistrano session.

Some tasks were not listed, either because they have no description,
or because they are only used internally by other tasks. To see all
tasks, type `cap -vT'.

Extended help may be available for these tasks.
Type `cap -e taskname' to view it.

capistrano は「開発環境から運用環境に対していろいろがんばる」ツールなので、開発環境にインストールされていれば良く、サーバ側にはなにもいりません。

SSH 鍵ペアの作成

capistrano が「開発環境から運用環境に対していろいろがんばる」ためには、運用環境に安全にログインして操作するための仕組みが必要であり、これを公開鍵認証方式で行います。
Windows XP で公開鍵認証に使用する公開鍵/秘密鍵を作成するには、

あたりが使用できますが、普段からターミナルとして使用していて操作に慣れており、また teraterm menu が便利なため、今回は UTF-8 TeraTerm Pro を採用。*1 *2
公開鍵と秘密鍵を作成したら、秘密鍵は開発環境のホームディレクトリ配下に .ssh ディレクトリを作成して保存。

% mkdir ~/.ssh
% mv /path/to/id_rsa ~/.ssh/

公開鍵は運用環境へ転送し、ログインユーザのホームディレクトリ配下に .ssh ディレクトリを作成して authorized_keys に追記。authorized_keys に書いたらファイルは捨てて構いません。

$ mkdir ~/.ssh
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub

capify

rails アプリケーションは git で管理されているものとして、これを clone して

$ git clone git@gitserver:/var/git/sample.git
Initialized empty Git repository in d:/work/sample/.git/
git@gitserver's password:
remote: Counting objects: 112, done.
remote: Compressing objects: 100% (98/98), done.
Receiving objects:  65% (73/112)   d 0 (delta 0)Receiving objects:  58% (65/112)
Receiving objects: 100% (112/112), 85.21 KiB, done.
Resolving deltas: 100% (29/29), done.

capistrano でデプロイ操作を行えるよう capify すると

$ cd sample/
$ capify .
[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!

こんな deploy.rb が作成される。

set :application, "set your application name here"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

で、これを適当に編集すればいいわけなのですが、ssh でハマり過ぎ。permission denied を 300 回くらい見た気がします。
普段ならキレまくったあとに自分が悪い事に気付いて赤面したりするのが関の山なのですが、Windows XP + capistrano の組み合わせは難易度高過ぎ。
疲れ果ててキレる元気も残っていないので続きは明日。

*1:PuTTY は鍵フォーマットが独自仕様らしく、色々とハマってムカついたのでお勧めしません。

*2:OpenSSH は cygwin とか gitbash に付いて来ますが、触ってないのでよく分かりません。