StupidDog's blog

IT関連の手近な所で、疑問に思った事を調べた記録

「Ubuntu12.10にVagrant/PuppetでRailsの環境を作成する(その2)」|ただいまRubyの修行中

はじめに

前回のその1では、Vagrantにより仮想マシンを立ち上げるところまで行いました。
今回は仮想マシン上にRailsの環境を作成していきます。
最終的な環境が決まったところでPuppetによる自動化を行うとして、とりあえず手動で環境を確定していきます。

参考にしているサイト
Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで) - Qiita

作成したい環境(仮)

ただ、必要なソフトウェアを入れてサンプルが動いて終わるのではなく、実務で開発を行えるような環境の構築がしたいので目標を立てます。

  1. ソース管理を行える(Githubを使用します)
  2. RubyRailsのバージョンが変わっても対応できる(rbenvとbundlerを使用します)
  3. 実機へのデプロイを考えたファイルの構成(目標はherokuへのデプロイ)

まぁ、ゴールは大きく遠ければ色々できるでしょう(^ワ^)ノ

Vagrantにより作成された仮想マシンとネットワークの構成を確認する

自動で作成できたのですが、まったく環境を把握せずに使用するのでは応用が効きません。
概要だけでも調べておきます。

仮想マシンの情報
$ virtualbox

により、VirtualBoxGUIが起動します。ツールバー上の「設定(S)」ボタンで設定画面を表示して詳細を確認します。
有効になっている項目のみ一覧にしました。これが構築直後の仮想マシンの設定です。

システム
メインメモリー 512MB
起動順序 ハードディスク、CD/DVD
プロセッサー数 1
使用率制限 100%(制限なし)
ディスプレイ
ビデオメモリー 8MB
ストレージ
デバイス ハードディスク
タイプ(形式) 通常(VMDK)
仮想的なサイズ 9.90GB
実際のサイズ 1.32GB
詳細 可変サイズのストレージ
場所 ~/VirtualBox VMs/ubuntu1310-i386_1391024958454_21530/ubuntu1310-i386-disk1.vmdk
割り当て ubuntu1310-i386_1391024958454_21530
ネットワーク
アダプター(1) アダプター1:有効
割り当て 割り当て:NAT
アダプタータイプ アダプタータイプ:Intel PRO/1000MT Desktop(82540EM)
プロミスキャストモード プロミスキャストモード:拒否
MACアドレス MACアドレス:08002730A32F
接続 ケーブル接続
ポートフォワーディング
名前 ssh
プロトコル TCP
ホストIP 127.0.01
ホストポート 2222
ゲストポート 22
共有フォルダー
名前 /vagrant
パス ~/vm/001
アクセス権 完全
状態 永久化
ネットワークの構成
vagrant@ubuntu1310-i386:~$ ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 08:00:27:30:a3:2f  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe30:a32f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1875 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1730 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:165262 (165.2 KB)  TX bytes:159853 (159.8 KB)

vagrant@ubuntu1310-i386:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0

vagrant@ubuntu1310-i386:~$ nslookup
> server 
Default server: 10.0.2.3
Address: 10.0.2.3#53
> exit

ホストの環境も含めて図にしてみました。

f:id:StupidDog:20140201133306p:plain

構築作業の再開

環境の把握も大体できたところで、開発に必要なツールをインストールしていきます。

  1. gitのインストール
  2. rbenvのインストール
  3. Rubyのインストール
  4. bundlerのインストール
  5. Ruby on Railsのインストール

gitのインストール

少々、バージョンが低いのですがコンパイルから導入するのは敷居が高いので、とりあえずaptに頼ります。

$ sudo apt-cache install git
E: Invalid operation install
vagrant@ubuntu1310-i386:~$ sudo apt-get install git
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  git-man liberror-perl
Suggested packages:
  git-daemon-run git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-bzr git-cvs git-svn
The following NEW packages will be installed:
  git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 4 not upgraded.
Need to get 8,487 kB of archives.
After this operation, 19.7 MB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://us.archive.ubuntu.com/ubuntu/ saucy/main liberror-perl all 0.17-1 [23.8 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ saucy/main git-man all 1:1.8.3.2-1 [670 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ saucy/main git i386 1:1.8.3.2-1 [7,793 kB]                                                                                                                  
Fetched 8,487 kB in 42s (198 kB/s)                                                                                                                                                                     
Selecting previously unselected package liberror-perl.
(Reading database ... 62328 files and directories currently installed.)
Unpacking liberror-perl (from .../liberror-perl_0.17-1_all.deb) ...
Selecting previously unselected package git-man.
Unpacking git-man (from .../git-man_1%3a1.8.3.2-1_all.deb) ...
Selecting previously unselected package git.
Unpacking git (from .../git_1%3a1.8.3.2-1_i386.deb) ...
Processing triggers for man-db ...
Setting up liberror-perl (0.17-1) ...
Setting up git-man (1:1.8.3.2-1) ...
Setting up git (1:1.8.3.2-1) ...

rbenvのインストール

apt-getでインストールしようとした場合

rubyのインストールも提案してくれるのですが古いので、githubから最新をインストールすることにします。
(2014.2.1 rbenv は 0.4.0-89-g14bc162 が最新)

しかし、rbenv自体はbashスクリプトで書かれているので実行にrubyを必要としません。
何故、rubyのインストールまでしちゃうのか…。

$ sudo apt-get install rbenv
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libruby1.8 ruby1.8
Suggested packages:
  ruby1.8-examples ri1.8 ruby-switch
The following NEW packages will be installed:
  libruby1.8 rbenv ruby1.8
0 upgraded, 3 newly installed, 0 to remove and 4 not upgraded.
Need to get 1,826 kB of archives.
After this operation, 6,782 kB of additional disk space will be used.
Do you want to continue [Y/n]? n
Abort.

$ sudo apt-cache show rbenv
Package: rbenv
Priority: optional
Section: universe/ruby
Installed-Size: 102
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Ruby Extras Maintainers <pkg-ruby-extras-maintainers@lists.alioth.debian.org>
Architecture: all
Version: 0.3.0-1
...

rbenvをgithubから取得してインストール

sstephenson/rbenv · GitHubのREADME.mdで、Installation以下に書いてあるBasic GitHub Checkoutの手順に従ってインストールします。

ファイルの取得
vagrant@ubuntu1310-i386:~$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/vagrant/.rbenv'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 290.90 KiB | 111.00 KiB/s, done.
Resolving deltas: 100% (1162/1162), done.
Checking connectivity... done
パスを通す

次回の起動時からも使用できるように、ログインシェルの環境設定ファイルへパスの設定を追加します。
環境設定ファイルは、~/.bash_profile ではなく ~/.bashrc になります。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
確認する

「rbenvは関数です」となれば成功です。

$ type rbenv
vagrant@ubuntu1310-i386:~$ type rbenv
rbenv is a function
rbenv () 
{ 
    local command;
    command="$1";
    if [ "$#" -gt 0 ]; then
        shift;
    fi;
    case "$command" in 
        rehash | shell)
            eval "`rbenv "sh-$command" "$@"`"
        ;;
        *)
            command rbenv "$command" "$@"
        ;;
    esac
}

rbenvのバージョンが上がりアップグレードを行う場合は「git pull」でアップグレードできます。

$ cd ~/.rbenv
$ git pull
必須プラグイン(ruby-build)をインストールする

インストール可能なrubyのバージョンをリストしたり、インストールするためにプラグインを追加します。

vagrant@ubuntu1310-i386:~$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/vagrant/.rbenv/plugins/ruby-build'...
remote: Reusing existing pack: 2856, done.
remote: Total 2856 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (2856/2856), 472.89 KiB | 144.00 KiB/s, done.
Resolving deltas: 100% (1254/1254), done.
Checking connectivity... done

これで、「rbenv install」コマンドが使用できます。

Rubyのインストール

インストール可能なバージョンをリスト
$ rbenv install -l
...
  2.0.0-rc1
  2.0.0-rc2
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.2.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
...
Rubyをインストール

ファイルは「~/.rbenv/versions/<バージョン番号>/」にインストールされます。
折角なのでファイルが配置されるディレクトリを観察します。

vagrant@ubuntu1310-i386:~$ ll -R .rbenv/versions/ .rbenv/shims/
.rbenv/shims/:
total 8
drwxrwxr-x 2 vagrant vagrant 4096 Jan 31 21:28 ./
drwxrwxr-x 9 vagrant vagrant 4096 Jan 31 11:29 ../

.rbenv/versions/:
total 8
drwxrwxr-x 2 vagrant vagrant 4096 Jan 31 11:29 ./
drwxrwxr-x 9 vagrant vagrant 4096 Jan 31 11:29 ../

初期状態で何も無いことを確認…無いですね。

$ rbenv install 2.1.0
vagrant@ubuntu1310-i386:~$ rbenv install 2.1.0
Downloading ruby-2.1.0.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9e6386d53f5200a3e7069107405b93f7
Installing ruby-2.1.0...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20140131214001.1434
Results logged to /tmp/ruby-build.20140131214001.1434.log

Last 10 log lines:
                              io-console 0.4.2
                              json 1.8.1
                              minitest 4.7.5
                              psych 2.0.2
                              rake 10.1.0
                              rdoc 4.1.0
                              test-unit 2.1.0.0
installing rdoc:              /home/vagrant/.rbenv/versions/2.1.0/share/ri/2.1.0/system
installing capi-docs:         /home/vagrant/.rbenv/versions/2.1.0/share/doc/ruby
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

…エラーですよノДT)
(実は一度、既存のRubyをpurgeしました。関連してるpackageも一緒に…)
Setting up and installing rbenv, ruby-build, rubies, rbenv-gemset, and bundlerInstall rubiesで、
rbenv-buildに必要なパッケージをリストしているので、参考にさせてもらいます。
余計なpurgeが無ければ必要ないはずの作業です

パッケージを追加して再度、Rubyインストール

vagrant@ubuntu1310-i386:~$ sudo apt-get install libssl-dev zlib1g-dev libreadline-dev libyaml-dev flex gettext
vagrant@ubuntu1310-i386:~$ rbenv install 2.1.0
Downloading ruby-2.1.0.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9e6386d53f5200a3e7069107405b93f7
Installing ruby-2.1.0...
Installed ruby-2.1.0 to /home/vagrant/.rbenv/versions/2.1.0

vagrant@ubuntu1310-i386:~$ rbenv rehash

そして観察です。
「.rbenv/versions/」の下には 2.1.0の新しいディレクトリが作成されています。
中には大量のファイルが143MBほどあるようです。

vagrant@ubuntu1310-i386:~$ ll .rbenv/versions/ 
total 12
drwxrwxr-x  3 vagrant vagrant 4096 Jan 31 22:27 ./
drwxrwxr-x 10 vagrant vagrant 4096 Jan 31 21:37 ../
drwxr-xr-x  6 vagrant vagrant 4096 Jan 31 22:39 2.1.0/

vagrant@ubuntu1310-i386:~$ du -sh .rbenv/versions/2.1.0/
143M	.rbenv/versions/2.1.0/

「.rbenv/shims/」の下には幾つかのスクリプトが作成されています。
ruby」コマンドを実行した場合、このディレクトリにある「rubyスクリプトが呼び出されるようです。
ここで、バージョンを切り替えているみたいです。
そして、お約束として「rbenv」コマンドで何か変更した場合は、必ず「rbenv rehash」コマンドを実行して「.rbenv/shims/」を更新します。

vagrant@ubuntu1310-i386:~$ ll -R .rbenv/shims/
.rbenv/shims/:
total 40
drwxrwxr-x  2 vagrant vagrant 4096 Jan 31 22:39 ./
drwxrwxr-x 10 vagrant vagrant 4096 Jan 31 21:37 ../
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 erb*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 gem*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 irb*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 rake*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 rdoc*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 ri*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 ruby*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 testrb*

vagrant@ubuntu1310-i386:~$ which ruby
/home/vagrant/.rbenv/shims/ruby
インストールしたrubyのバージョンを使えるようにする

rbenvは初期状態で、システム上にあるrubyを呼び出す設定になっています。
「rbenv versions」により選択できるバージョンと、選択されているバージョン(*が付いてる)が分かります。
「rbenv global 2.1.0」により切り替えることができます。

vagrant@ubuntu1310-i386:~$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.1.0

vagrant@ubuntu1310-i386:~$ rbenv global 2.1.0 
vagrant@ubuntu1310-i386:~$ rbenv versions
  system
* 2.1.0 (set by /home/vagrant/.rbenv/version)

vagrant@ubuntu1310-i386:~$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [i686-linux]

これで、やっと希望バージョンのRubyが使用可能になりました。

bundlerのインストール

RubyGemsは、現在有効にしているRubyのバージョン毎にインストールすることになります。
「rbenv exec gem install bundler」コマンドでインストールします。

2014.02.11 追記
「rbenv」導入により「gem」コマンドが「.rbenv/shims/gem」スクリプトの呼出しになる。
このスクリプトは、最終的に「rbenv exec xxx」の呼出しを行うように作られているので、「rbenv exec」を付ける必要はありせん。

rbenvの切り替えの仕組み…と、他言語での実験 - すぎゃーんメモ

vagrant@ubuntu1310-i386:~$ rbenv exec gem install bundler
Fetching: bundler-1.5.2.gem (100%)
Successfully installed bundler-1.5.2
Parsing documentation for bundler-1.5.2
Installing ri documentation for bundler-1.5.2
Done installing documentation for bundler after 3 seconds
1 gem installed

vagrant@ubuntu1310-i386:~$ rbenv rehash
vagrant@ubuntu1310-i386:~$ ll -R .rbenv/shims/
.rbenv/shims/:
total 48
drwxrwxr-x  2 vagrant vagrant 4096 Feb  1 00:36 ./
drwxrwxr-x 10 vagrant vagrant 4096 Jan 31 23:45 ../
-rwxrwxr-x  2 vagrant vagrant  401 Feb  1 00:36 bundle*
-rwxrwxr-x  2 vagrant vagrant  401 Feb  1 00:36 bundler*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 erb*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 gem*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 irb*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 rake*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 rdoc*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 ri*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 ruby*
-rwxrwxr-x  8 vagrant vagrant  401 Jan 31 22:39 testrb*

またまた観察です。「rbenv rehash」コマンドにより「bundle」と「bundler」が増えています。

実験
vagrant@ubuntu1310-i386:~$ rbenv global system 
vagrant@ubuntu1310-i386:~$ bundle
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.1.0

別バージョンへ切り替えて、インストールしていないGemを呼び出そうとすると怒られます。

まとめ

残るはRuby on Railsのインストールだけですが、RailsのバージョンをRubyのバージョン毎に対応させるか、Railsアプリ毎に対応させるかが問題になります。
対応のさせかたによりディレクトリの構成や手順が変わるので方針を決めるために、ここで休憩します。
だんだん具体的なイメージがつかめてきましたぞっと!