m-namikiの日記

おもしろき こともなき世を おもしろく

Ruby on Railsチュートリアルの写経を始めました

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
Vagrant+Chefで環境構築する方法がなんとなく理解できてきましたが、ただ環境を作るだけじゃもったいないのでRailsチュートリアルの写経を始めてみようと思います。環境は以下の通りです。

OS Windows7 x64
VirtualBox VirtualBox 4.3.8 for Windows hosts
Ruby ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
Vagrant Vagrant 1.5.1
chef chef (11.10.4 x86-mingw32)
knife knife-solo (0.4.1)
berkshelf berkshelf (2.0.14)

VagrantとChefの導入についてはVagrant + Chefの導入 vol.1 - m-namikiの日記Vagrant + Chefの導入 vol.2 - m-namikiの日記で行ってますが、vagrant用のプラグインとberkshelfのインストールをしてなかったのでしておきます。

saharaのインストール

saharaは仮想サーバのスナップショットのようなものを作ることができるvagrantプラグインです。環境のロールバック、コミットが可能なので何かあった場合に簡単に変更を取り消すことができます。インストール方法は以下の通りです。

vagrant plugin install sahara

vagrant-omnibusのインストール

vagrant-omnibusは仮想サーバ起動時にChefがインストールされているかどうかをチェックして、インストールされていない場合は自動でインストールしてくれるvagrantプラグインです。環境構築を自動化したいのにそのために手動でChefをインストールするのは本末転倒なので非常にありがたいですね。インストール方法は以下の通りです。

vagrant plugin install vagrant-omnibus

Berkshelfのインストール

BerkshelfはChefのはcookbookの依存関係を管理するツール(らしい)です。まだhttp://community.opscode.com/からcookbookをダウンロードするのが楽になるくらいしか分かっていませんが、インストールしておきます。gemとして提供されているので以下の通りにインストールします。

gem install berkshelf --no-ri --no-rdoc

仮想サーバの作成

ここから仮想サーバの作成を行っていきます。

cd C:\Users\m-namiki\Documents\20_vagrant
mkdir rails3_tutorial
cd rails3_tutorial
vagrant init chef/centos-6.5

chef-repoの作成

Vagrantfileがある場所にchef用のリポジトリを作成します。

knife solo init chef-repo
cd chef-repo
knife cookbook create ruby_env -o site-cookbooks

Berksfileの編集

Berkshelfがインストールしてあるとknife cookbook時にBerksfileが作成されるので編集します。

// chef-repo/Berksfile
site :opscode
cookbook 'yum'
cookbook 'ruby_build'
cookbook 'rbenv'
cookbook 'nodejs'

rubyのインストールはrbenv+ruby_buildで行います。nodejsについては、rails serverを実行したときにJavaScriptランタイムがインストールされていないと言われたのでインストールします。で、Berkshelfの実行。

berks install --path cookbooks

これでcookbooks/以下にyumruby_build、rbenv、その他それらと依存関係があるcookbookがインストールされました。

site-cookbooks/ruby_env/recipes/default.rbの編集

続いてレシピの編集です。

# for install Ruby
include_recipe "rbenv::default"
include_recipe "rbenv::ruby_build"
include_recipe "rbenv::rbenv_vars"

service "iptables" do
  action [:disable, :stop]
end
log "done iptables stop."

# add the EPEL repo
yum_repository 'epel' do
  description 'Extra Packages for Enterprise Linux'
  mirrorlist 'http://mirrors.fedoraproject.org/mirrorlist?repo=epel-6&arch=$basearch'
  fastestmirror_enabled true
  gpgkey 'http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6'
  action :create
end

# add the Remi repo
yum_repository 'remi' do
  description 'Les RPM de Remi - Repository'
  baseurl 'http://rpms.famillecollet.com/enterprise/6/remi/x86_64/'
  gpgkey 'http://rpms.famillecollet.com/RPM-GPG-KEY-remi'
  fastestmirror_enabled true
  action :create
end

%w{sqlite-devel}.each do |p|
  package p do
    action :install
  end
end
log "done package install."

rbenv_ruby "1.9.3-p545" do
  ruby_version "1.9.3-p545"
  global true
end
log "done ruby install."

gem_package "rbenv-rehash" do
  action :install
end
log "done rehash install."

gem_package "rails" do
  action :install
  version '3.2.14'
end
log "done rails3 install."

rbenvでrubyをインストールした場合、gem install後に必ずrbenv rehashをしなければならないそうなので、それを回避するためにrbenv-rehashを一緒にインストールしておきます。

Vagrantfileを編集

最後にVagrantfileを編集します。以下は変更部分です。

# Railsのサーバ用ポート
config.vm.network "forwarded_port", guest: 3000, host: 3333

config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
end

config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = ["./chef-repo/cookbooks", "./chef-repo/site-cookbooks"]
  chef.add_recipe "yum"
  chef.add_recipe "rbenv"
  chef.add_recipe "ruby_env"
  chef.add_recipe "nodejs"
end

# この行追加
config.omnibus.chef_version = :latest

forwarded_portについては、rails server実行時にhttp://localhost:3000にアクセスしろと言われますが、そのままではアクセスできなかったので3333に変更しました。

起動

準備が整ったのでvagrant upで起動します。自分の環境だとrubyとnodejsのインストールにそれぞれ10分くらい掛かりましたが、無事インストールが完了して起動しました。

[vagrant@localhost ~]$ ruby -v
ruby 1.9.3p545 (2014-02-24 revision 45159) [x86_64-linux]
[vagrant@localhost ~]$ rails -v
Rails 3.2.14
[vagrant@localhost ~]$ node -v
v0.10.15

で、ここまでの状態を一旦コミットしておきます。

vagrant sandbox on
vagrant sandbox commit

これで何か変更を加えてもすぐに元に戻せるので安心です。

作成したVagrantfileやchef-repoを以下で公開してみました。
m-namiki/rails3-tutorial_environment · GitHub
写経したものはこっちに公開していきます。
m-namiki/rails3-projects · GitHub
実はこれをやってみたかった:)