「Ubuntu12.10にVagrant/PuppetでRailsの環境を作成する(その2)」|ただいまRubyの修行中
はじめに
前回のその1では、Vagrantにより仮想マシンを立ち上げるところまで行いました。
今回は仮想マシン上にRailsの環境を作成していきます。
最終的な環境が決まったところでPuppetによる自動化を行うとして、とりあえず手動で環境を確定していきます。
参考にしているサイト
Rails開発環境の構築(rbenvでRuby導入からBundler、Rails導入まで) - Qiita
作成したい環境(仮)
ただ、必要なソフトウェアを入れてサンプルが動いて終わるのではなく、実務で開発を行えるような環境の構築がしたいので目標を立てます。
- ソース管理を行える(Githubを使用します)
- RubyやRailsのバージョンが変わっても対応できる(rbenvとbundlerを使用します)
- 実機へのデプロイを考えたファイルの構成(目標はherokuへのデプロイ)
まぁ、ゴールは大きく遠ければ色々できるでしょう(^ワ^)ノ
Vagrantにより作成された仮想マシンとネットワークの構成を確認する
自動で作成できたのですが、まったく環境を把握せずに使用するのでは応用が効きません。
概要だけでも調べておきます。
仮想マシンの情報
$ virtualbox
により、VirtualBoxのGUIが起動します。ツールバー上の「設定(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
ホストの環境も含めて図にしてみました。
構築作業の再開
環境の把握も大体できたところで、開発に必要なツールをインストールしていきます。
- gitのインストール
- rbenvのインストール
- Rubyのインストール
- bundlerのインストール
- 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 bundlerのInstall 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アプリ毎に対応させるかが問題になります。
対応のさせかたによりディレクトリの構成や手順が変わるので方針を決めるために、ここで休憩します。
だんだん具体的なイメージがつかめてきましたぞっと!