rvm-capistrano を使って RVM をインストールする
chef 見習いの @tk0miya です。全国の chef 使いのみなさん、いかがお過ごしでしょうか。
最近、自分が使っている VM に入っている ruby の数を調べてみてびっくりしました。
- OS 標準のもの (/usr/bin/ruby)
- Chef Omnibus Installer 由来のもの (/opt/chef/omnibus/bin/ruby)
- RVM 由来のもの (/home/xxxx/.rvm/...)
- Vagrant 由来のもの (/usr/local/bin/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 がセットアップされます。