rvm-capistrano を使って RVM をインストールする

chef 見習いの @tk0miya です。全国の chef 使いのみなさん、いかがお過ごしでしょうか。

最近、自分が使っている VM に入っている ruby の数を調べてみてびっくりしました。

このうち、アプリケーションが利用しているのは RVM 由来のものだけです。
更に調べてみると、このうち 3箇所に chef がインストールされている不思議な状態になっていました。

今回はこの環境を整理して、RVM にまとめてみたいと思います。実験環境は CentOS 6.3 です。

capistrano を使って RVM をインストールする

最近、アプリケーションのデプロイに capistrano を使うことが増えているので、
RVM のセットアップも capistrano で行います。

capistrano には rvm-capistrano という RVM を扱うためのプラグインが提供されているので、今回はこれを利用します。

ちなみに、capistrano にはリモートから chef-solo を実行する roundsman というプラグインが提供されているので、
環境構築とアプリケーションのデプロイをまとめて面倒見ることができます。

では capistrano を使うために Gemfile を書いていきます。
利用するものは先ほど挙げた capistrano, rvm-capistrano の他、表示を見やすくする capistrano-colors です。

source 'https://rubygems.org'

group :deploy do
  gem 'capistrano'
  gem 'capistrano_colors'
  gem 'rvm-capistrano'
end

次に bundlr を実行してライブラリをインストールします。

$ bundle install

capistrano の設定をする

まずは capify コマンドで capistrano の設定ファイル郡を生成します。

$ bundle exec capify .

生成された config/deploy.rb を次のように書き換えてみます。

require 'capistrano_colors'

set :application, "application"
set :repository,  "https://github.com/example/application"
set :deploy_to,   "/home/app/application"

role :web, "localhost"
role :app, "localhost"
role :db,  "localhost"

# deploy settings
ssh_options[:port] = "2222"
default_run_options[:pty] = true
set :user,     "app"
set :password, "app"
set :use_sudo, false

# RVM configs
require 'rvm/capistrano'
set :rvm_ruby_string , "ruby-1.9.3-p374@#{application}"
before 'deploy:setup', 'rvm:install_rvm'
before 'deploy:setup', 'rvm:install_ruby'

ポイントは RVM configs と書いてある箇所です。
ここでは rvm-capistrano を読み込み、ruby のバージョンを指定しています。
また、deploy:setup タスクの実行後に RVM と Ruby をインストールするよう設定しています。

最後に設定対象のホストにデプロイ用のユーザを作成します。
ここでは app というユーザ名にしています。

$ cat setup.sh
#!bin/sh

sudo /usr/sbin/groupadd -g 10000 app
sudo /usr/sbin/adduser  -u 10000 app -g app -G app
echo 'app' | sudo passwd --stdin app
$ cat setup.sh | bundle exec vagrant ssh

説明するためにえいやっとパスワードを設定していますが、本番環境などでは SSH 鍵を使うようにしてください。

実行してみる

ここまでで準備が完了しました。早速実行してみましょう。

$ bundle exec cap deploy:setup

これでおしまいです。/home/app/.rvm 以下に RVM がインストールされています。
インストール後、capistrano 経由で実行する ruby はこの ruby を利用するようになります。

なお、rvm-capistrano は RVM の default を設定しないため、ログインしても system の ruby を見るようになっています。
ログインして ruby を使う場合は

$ rvm use ruby-1.9.3 --default

などとして、ruby を切り替えておくことをおすすめします。

おまけ: CentOS 5.x で ruby-1.9.3 をビルドする

お仕事で CentOS 5.x を使う機会があるので、一緒にメモっておきます。
ruby-1.9.3 は autoconf (>= 2.6.0) を要求してくるので、CentOS 5.x の標準構成ではビルドできません。
そこで、config/deploy.rb に次の内容を書き足します。

namespace :rvm do
  desc "Install build dpendencies of Ruby"
  task :install_build_depends do
    run "wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/autoconf26x-2.63-4.ius.el5.noarch.rpm -O /tmp/autoconf26x-2.63-4.ius.el5.noarch.rpm", :shell => 'bash'
    run "#{sudo} rpm -ivh /tmp/autoconf26x-2.63-4.ius.el5.noarch.rpm || true", :shell => 'bash'
    run "rm /tmp/autoconf26x-2.63-4.ius.el5.noarch.rpm", :shell => 'bash'
  end
  before 'rvm:install_ruby', 'rvm:install_build_depends'
end

rvm:install_ruby タスクの前に IUS から rpm パッケージを持ってくるようにしたものです。

これを設定し、デプロイユーザ(app)が sudo できるように設定しておくと、CentOS 6.3 と同様に

$ bundle exec cap deploy:setup

だけで RVM と Ruby がセットアップされます。