vagrantコマンド実行に使われるrubyのパスやバージョンを知る方法

投稿者: | ↻ : 2019年1月28日

Vagrantを利用して開発環境を構築している時に、ふと、ホストOSにもRubyをインストールしているけど、Vagrantが要求しているバージョンとあっているのかと疑問に思ったことがありました。
結果は、Vagrantが埋め込みのRubyを持っているので、ホストOS上のRubyは利用されません。

これを伝聞ではなく、自分で確認しておきたくて考えた方法をまとめました。

検証環境


$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29

$ ruby -v
ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin16]

$ which ruby
/Users/stupiddog/.rbenv/shims/ruby

デバッグログによるRubyバージョンの確認

デバッグオプションを指定するとログの始めの数行に、各種バージョンの情報が出力されます。
しかし、ベースとなる環境に同じバージョンのrubyをインストールしている場合に区別がつきません。


$ vagrant --debug 2>&1 | head -n 10
 INFO global: Vagrant version: 1.9.5
 INFO global: Ruby version: 2.2.5
 INFO global: RubyGems version: 2.4.5.1
 INFO global: VAGRANT_OLD_ENV_GIT_DIFF_OPTS="-U0"
 INFO global: VAGRANT_OLD_ENV_EDITOR="vim"
 INFO global: VAGRANT_OLD_ENV___CF_USER_TEXT_ENCODING="0x1F5:0x1:0xE"
 INFO global: VAGRANT_OLD_ENV_XPC_FLAGS="0x0"
 INFO global: VAGRANT_OLD_ENV_PS1="\\n\\h@\\u \\[\\e[0;33m\\]$(__git_ps1) \\[\\e[0;32m\\]\\w\\[\\e[00m\\] \\$ "
 INFO global: VAGRANT_OLD_ENV_RBENV_SHELL="bash"
 INFO global: VAGRANT_OLD_ENV_TMPDIR="/var/folders/p3/yx7d8t1n2cb416lm0nnmkvgc0000gn/T/"

VagrantFileによる確認

Vagrantの設定ファイルであるVagrantFileは、rubyのコードとして実行されます。
なので、通常のrubyのコードで各種パスの取得を記述します。

RbConfigライブラリを利用して、Rubyインタプリタ実行時に設定された情報を取得します。
Rbconfig.rubyは、rubyコマンドのフルパスを返します。

– VagrantFileの先頭に2行追加します。


require "rbconfig"
puts "[ruby]:" + RbConfig.ruby

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
end

– VagrantFileが処理されれば良いので、VagrantFileの妥当性をチェックして実行させます。


$ vagrant validate
[ruby]:/opt/vagrant/embedded/bin/ruby
Vagrantfile validated successfully.

$ /opt/vagrant/embedded/bin/ruby -v
ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin13]

これで、必要な情報が整いました。

まとめ

検証環境には「/Users/stupiddog/.rbenv/shims/ruby」にあるruby version 2.2.6rubyがあり、Vagrantが実行に利用したのは「/opt/vagrant/embedded/bin/ruby」にあるruby version 2.2.5であることが確認できました。

おまけ

Vagrant埋め込みのrubyは、いつインストールされているのか

Vagrantの製品アーカイブ(.pkg)ファイルの中に含まれていて、Vagrantインストール時に合わせてインストールされます。
[macOS] .dmg & .pkgファイルの中身を確認する方法で、.pkgファイルの中身を確認すると、rubyが含まれているのが分かります。


$ hdiutil attach vagrant_2.0.0_x86_64.dmg 
期待される結果 CRC32 $07F4946A
/dev/disk2          	GUID_partition_scheme          	
/dev/disk2s1        	Apple_HFS                      	/Volumes/Vagrant

$ pkgutil --payload /Volumes/Vagrant/vagrant.pkg | grep "/lib/ruby/" | head -n 10
./embedded/lib/ruby/2.3.0
./embedded/lib/ruby/2.3.0/abbrev.rb
./embedded/lib/ruby/2.3.0/base64.rb
./embedded/lib/ruby/2.3.0/benchmark.rb
./embedded/lib/ruby/2.3.0/bigdecimal
./embedded/lib/ruby/2.3.0/bigdecimal/jacobian.rb
./embedded/lib/ruby/2.3.0/bigdecimal/ludcmp.rb
./embedded/lib/ruby/2.3.0/bigdecimal/math.rb
./embedded/lib/ruby/2.3.0/bigdecimal/newton.rb
./embedded/lib/ruby/2.3.0/bigdecimal/util.rb

Vagrant version 2.0.0に付いてくるrubyのバージョンは、2.3.0系というのが、なんとなく分かります。

これを、実際にインストール(バージョンアップ)すると、古いバージョンが消えて新しいバージョンになっているのが確認できます。


$ vagrant validate
[ruby]:/opt/vagrant/embedded/bin/ruby
Vagrantfile validated successfully.

$ /opt/vagrant/embedded/bin/ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-darwin13]