Capistrano3を入れて、簡単なタスクを実行するまでやります。
とりあえず動かして感覚掴みたい人向け。
Capistrano概要
Ruby製デプロイツールです。
ただ、デプロイツールと言ってもその実態はSSH先の環境ごとに一連のRakeタスクを実行するだけです。
つまり必要な作業は
- 鍵の作成、デプロイ先への登録
- 環境ごとの設定
- 実行したいタスク(任意のrubyまたはシェルコマンド)の記述
だけです。とっても簡単!
環境
以下環境で行いました
Ruby 2.1.1
Rails 4.0.3
鍵の作成
$ cd ~/.ssh/
# 鍵名capistrano(なんでもいいです)、パスフレーズ無しで作成
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): capistrano
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...
今回はとりあえず実行ということでlocalhostにsshしようと思うので自身の~/.ssh/authorized_keys
に先ほど作成した公開鍵を書き込みます
$ cat ~/.ssh/capistrano.pub >> ~/.ssh/authorized_keys
インストール
Capistrano3からはRails依存を辞め、bundlerやmigrateなどの各種機能をモジュールとして切り離しています。
Gemfileにcapistranoを追記
group :development do
gem 'capistrano'
end
インストールしてひな形作成までします。
# capistranoインストール
$ bundle install
# ひな形作成
# cap はCaistranoの実行コマンド
$ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
作成したひな形をいじいじしていきます。
各種設定
Capfile
各種ライブラリをrequire
する場所です。
最初からたくさんのrequire
がコメントアウトされていますが、今回は関係ないのでこのままでOK!
config/deploy/環境名.rb
環境ごとの設定を記述します。
ひな形ではstaging.rb
とproduction.rb
が生成されます。
ただRailsのデフォルトの環境はdevelopmentです。
なので今回はとりあえずstaging.rb
をコピってdevelopment.rb
を作成。
ここにdevelopment環境での設定を記述していきます。
が、今回は初期値のままでいきます。
localhostにsshする際の設定をしていきます。
# 今ログインしているユーザをvagrantとした時の設定
# 'vagrant'とssh_optionsの鍵名'capistrano'は適宜自分の環境での名前に置き換えて下さい
role :app, %w{vagrant@localhost}
role :web, %w{vagrant@localhost}
role :db, %w{vagrant@localhost}
server 'localhost', user: 'vagrant', roles: %w{web app}, ssh_options: { keys: %w(~/.ssh/capistrano) }
role
アプリケーションサーバー、Webサーバー、DBサーバーでの各ユーザ@ホスト名(or IPアドレス)
を記述しておきます。
タスクを記述する際にrole
によって実行するタスクを振り分けて書くことができます。server
作業対象となるサーバーの情報を記述します。
この場合localhostにwebとappのロールを付与して、vagrantユーザでログインするといった記述になってます。
config/deploy.rb
各環境で共通の設定を記述します。
gitのリポジトリのurlや出力するログレベルなどなどを書きますが、とりあえずこのままで。
タスクの作成
どこに記述してもいいんですが今回はdevelopment.rb
に以下を記述します。
desc 'my first capistrano task' # 無くてok
task :first_task do
run_locally do
# executeでシェルコマンド実行
execute "echo hello wolrd"
end
end
これ実はただのRakeタスクです。
:first_task
が実行時のタスク名。
でその中のブロック、ここではrun_locally
というのが、このタスクをどこで実行するかを示しています。
(他には例えばon role(:web)
とするとweb
ロールを持つサーバーで実行されます。)
基本的にはさっきserver
で指定したサーバーにsshでログインして、そこでタスクを処理していくのですが、
run_locally
とすることでsshせずcap
コマンドを実行した場所(localhost)でタスクが走ります。
run_locally
にするとlocalhostにsshしてcapistranoを実行します。
Capistrano実行!
bundle exec cap 環境名 タスク名
で実行します!
$ bundle exec cap development first_task
INFO [c812a6d9] Running /usr/bin/env echo hello wolrd on localhost
DEBUG [c812a6d9] Command: echo hello wolrd
DEBUG [c812a6d9] hello wolrd
INFO [c812a6d9] Finished in 0.005 seconds with exit status 0 (successful).
色々出力されますが、どこかにhello worldと表示されてば成功です!
変更履歴
2016/03/09
環境を追記しました
当時Railsは4.0.3でした
2015/02/04
ssh周りを追記しました。
localhost(run_locally)で動かすときもlocalhostにsshして実行するがありました。