LoginSignup
5
4

More than 5 years have passed since last update.

Vagrantのprovisioningでrbenvを使ってrubyをインストールする

Last updated at Posted at 2017-02-09

Vagrantのprovisionでshellを使ってrbenvを利用する場合、ログイン後のCLIとは異なる環境となる。
そのため、以下に記すような設定が必要となる。OSはUbuntu14.04

依存パッケージのインストール

まずrbenvおよびrubyをインストールするために必要なパッケージをapt-getでインストールする。
config.vm.provision() の引数で特に指定しない場合は root でスクリプトが実行される。そのため$ apt-get installなどでsudoを指定する必要はない。

Vagrantfile
config.vm.provision "shell", inline: <<-SHELL
  apt-get install -y build-essential libssl-dev
  apt-get install -y ruby-build
SHELL

rbenvをインストールする

bashでインストールする場合は以下のようなコードとなる。rbenv自体のインストールはgit cloneがメイン。
この時 privileged: false を指定して vagrantユーザー で実行させる。
この設定がないと各ファイルの所有者や環境変数が root のものとなってしまい、意図したディレクトリにインストールされない。

$ echo ...の記述を~/.bashrcに追記することで、ログイン時にrbenvの初期化が行われ使用可能となる。この記述はrbenvを使う上で必須。

Vagrantfile
# rbenvをインストール
config.vm.provision "shell", privileged: false, inline: <<-SHELL

  if ! [ -d .rbenv ]
  then
    git clone https://github.com/sstephenson/rbenv.git .rbenv
    git clone https://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .bashrc
    echo 'eval "$(rbenv init -)"' >> .bashrc
  fi

SHELL

rbenvでrubyをインストールする

rbenvの初期化

rbenvを利用する場合、前述のとおり 初期化が必須 となる。
ログインをして利用する場合 ~/.bashrc に追記した内容がログイン時に実行されるのでCLIでrbenvを問題なく利用できる。
しかしプロビジョニング時は~/.bashrcを実行しないので、明示的に初期化が必要となる。これはcronなどで使う場合も同様。

# この2行が初期化処理
export PATH="/home/vagrant/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

これを実行することで以降の $ rbenv install などのコマンドが利用可能となる。

rbenvをvagrantユーザーで実行する

こちらも同様 privileged: false として vagrantユーザー で実行する必要がある。
rootで実行すると $HOME $USER といった環境変数はrootのものとなる。
そのため $ rbenv init - の結果もrootのものとなってしまい、rbenvコマンドが正常に初期化されない。

Vagrantfile
# install ruby by rbenv
config.vm.provision "shell", privileged: false, inline: <<-SHELL

  if [ -e .rbenv/bin/rbenv ]
  then
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"

    rbenv install -s 2.4.0
    rbenv rehash
    rbenv global 2.4.0
  fi
SHELL

以下が root での $ rbenv init - の出力。rootで実行されているので export などのパスがvagrantユーザーのものではない。

export PATH="/root/.rbenv/shims:${PATH}"
source "/usr/lib/rbenv/libexec/../completions/rbenv.bash"
rbenv rehash 2>/dev/null
rbenv() {
  typeset command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval `rbenv "sh-$command" "$@"`;;
  *)
    command rbenv "$command" "$@";;
  esac
}

まとめ

  • シェルを実行するユーザーを意識する
  • rbenv の初期化をおこなう

上記の2点がポイント。

Vagrantfile
Vagrant.configure("2") do |config|

  # rubyをrbenvでインストールする
  # install package
  config.vm.provision "shell", inline: <<-SHELL
    apt-get install -y build-essential libssl-dev
    apt-get install -y ruby-build
  SHELL

  # install rbenv
  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    if ! [ -d .rbenv ]
    then
      git clone https://github.com/sstephenson/rbenv.git .rbenv
      git clone https://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build
      echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> .bashrc
      echo 'eval "$(rbenv init -)"' >> .bashrc
    fi
  SHELL

  # install ruby by rbenv
  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    if [ -e .rbenv/bin/rbenv ]
    then
      export PATH="/home/vagrant/.rbenv/bin:$PATH"
      eval "$(rbenv init -)"

      rbenv install -s 2.4.0
      rbenv rehash
      rbenv global 2.4.0
    fi
  SHELL

end

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4