Vagrant の provisioning を使って、ruby をコードからインストールしてみる

[Vagrant 環境で serverspec のサンプルテストが実行されるまでの流れをメモ](http://qiita.com/kasei-san/items/429b40679c63b14d8caf) のつづき

## serverspec で、ruby 2.1 がインストールされていることのテストを書く 

```spec/default/ruby_spec.rb
require 'spec_helper'

describe command('/usr/local/bin/ruby -v') do
  it { should return_stdout 'ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]' }
end
```

### テスト実行

```shell-session
$ bundle exec rake spec 

ruby -S rspec spec/default/ruby_spec.rb
F

Failures:

  1) Command "ruby -v" should return stdout /\Aruby 2\.0\.0p451/
     Failure/Error: it { should return_stdout /\Aruby 2\.0\.0p451/ }
       sudo ruby -v
       expected Command "ruby -v" to return stdout /\Aruby 2\.0\.0p451/
     # ./spec/default/ruby_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 4.46 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/default/ruby_spec.rb:4 # Command "ruby -v" should return stdout /\Aruby 2\.0\.0p451/
ruby -S rspec spec/default/ruby_spec.rb failed
```

想定通りテスト失敗


## まずは手動で、ruby 2.1 を仮想マシンにインストール

以下、vagrant ssh した後の入力

### ログイン元のロケールを引き継いで警告が出たので、設定

```shell-session
$ echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
```

### wget

```shell-session
$ sudo yum install wget
```

### openssl

```shell-session
$ wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
$ tar xzf ./openssl-1.0.1f.tar.gz
$ cd openssl-1.0.1f
$ ./config --prefix=/usr/local/openssl shared
$ make
$ sudo make install
```

### zlib

```shell-session
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar xzf ./zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure
$ make
$ sudo make install
```

### ruby 

```shell-session
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
$ tar xzf ruby-2.1.1.tar.gz
$ cd ruby-2.1.1
$ ./configure --with-opt-dir=/usr/local/openssl --enable-shared 
$ make 
$ sudo make install
```

## serverspec が通ることを確認

```shell-session
$ bundle exec rake spec
ruby -S rspec spec/default/ruby_spec.rb
.

Finished in 3.93 seconds
1 example, 0 failures
```

## Vagrant の provisioning を使って shell で、仮想サーバに ruby 2.1 をインストール

### provisioning って?

- vagrant up 時に実行させる処理を指定できる設定

chef 等のプロビジョニングツールを指定することもできるがまずは、シェルスクリプトを直書きしてみる

```diff
$ git diff
diff --git a/Vagrantfile b/Vagrantfile
index 4fffb32..030cfc3 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -78,6 +78,42 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
   #   puppet.manifest_file  = "site.pp"
   # end

+  config.vm.provision :shell, :inline => <<-EOT
+    echo "encode setting"
+    # refs : http://d.hatena.ne.jp/tkrd/20120828/1346123699
+    echo "export LC_ALL=en_US.UTF-8" >> ~/.bashrc
+
+    echo "install wget"
+    sudo yum -y install wget
+
+    echo "install openssl"
+    wget http://www.openssl.org/source/openssl-1.0.1f.tar.gz
+    tar xzf ./openssl-1.0.1f.tar.gz
+    cd openssl-1.0.1f
+    ./config --prefix=/usr/local/openssl shared
+    make
+    sudo make install
+    cd
+
+    echo "install zlib"
+    wget http://zlib.net/zlib-1.2.8.tar.gz
+    tar xzf ./zlib-1.2.8.tar.gz
+    cd zlib-1.2.8
+    ./configure
+    make
+    sudo make install
+    cd
+
+    echo "install ruby"
+    wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
+    tar xzf ruby-2.1.1.tar.gz
+    cd ruby-2.1.1
+    ./configure --with-opt-dir=/usr/local/openssl --enable-shared
+    make
+    sudo make install
+    cd
+  EOT
+
   # Enable provisioning with chef solo, specifying a cookbooks path, roles
   # path, and data_bags path (all relative to this Vagrantfile), and adding
   # some recipes and/or roles.
```

### 一度 vagrant を削除して、再生成

```shell-session
$ vagrant destroy
$ vagrant up
```

15分位掛かってインストール成功

## 再度serverspec が通ることを確認

```shell-session
$ bundle exec rake spec
ruby -S rspec spec/default/ruby_spec.rb
.

Finished in 4.36 seconds
1 example, 0 failures
```