VirtualBox の VM を細かく設定する
VirtualBox の設定は virtualbox プロバイダの設定で行います。
VirtualBox プロバイダの customize メソッドは VirtualBox の VBoxManage コマンドを経由して、これから起動しようとしている VM のあらゆる設定を行います。
たとえば、メモリサイズを変更する場合は次のように書きます。
config.vm.provider :virtualbox do |vbox| vbox.customize ['modifyvm', :id '--memory', '4096'] end
VBoxManage コマンドの詳細は VirtualBox のドキュメント [ https://www.virtualbox.org/manual/ch08.html ] を確認してください。
メモリサイズや CPU コア数を設定する
仮想マシンの基本的なリソースもここで設定できます。
config.vm.provider :virtualbox do |vbox| # メモリサイズ vbox.customize ['modifyvm', :id, '--memory', '4096'] # CPU 利用率の制限 vbox.customize ['modifyvm', :id, '--cpuexecutioncap', '80'] # CPU コア数 vbox.customize ['modifyvm', :id, '--cpus', '4'] # CUP コア数を2以上にするのに必要 vbox.customize ['modifyvm', :id, '--ioapic', 'on'] # 64bit OS を使用するのに必要 vbox.customize ['modifyvm', :id, '--hwvirtex', 'on'] end
※ ゲスト OS が WIndows の場合など、CPU コア数を変更できない場合もあります。
VirtualBox の環境設定をする
クリップボードや入力インタフェースも同じように設定できます。
config.vm.provider :virtualbox do |vbox| # クリップボード共有の設定 vbox.customize ['modifyvm', :id, '--clipboard', 'bidirectional'] # ドラッグアンドドロップの設定(双方向はまだサポートされていないらしい) vbox.customize ['modifyvm', :id, '--draganddrop', 'hosttoguest'] # マウスの種類の選択 vbox.customize ['modifyvm', :id, '--mouse', 'usbtablet'] # キーボードの種類の選択 vbox.customize ['modifyvm', :id, '--keyboard', 'usb'] end
起動ロゴを設定する
VIrtualBox は 640 * 480 の非圧縮ビットマップファイルを起動ロゴとして表示できます。
Vagrantfile と同じディレクトリに logo.bmp を置いた場合は、次のように記述します。
config.vm.provider :virtualbox do |vbox| # 起動ロゴのファイルパス vbox.customize ['modifyvm', :id, '--bioslogoimagepath', "#{Dir::pwd}/logo.bmp"] # フェードインする vbox.customize ['modifyvm', :id, '--bioslogofadein', 'on'] # フェードアウトする vbox.customize ['modifyvm', :id, '--bioslogofadeout', 'on'] # 起動ロゴの表示時間 vbox.customize ['modifyvm', :id, '--bioslogodisplaytime', '10000'] end
名前解決をホストにブリッジする
VirtualBox の NAT エンジンは、デフォルトでゲストに対してホストに設定されている DNS サーバを登録します。
この設定を on にすると、ゲストはホストに登録されている DNS サーバのリストを参照します。
ゲストを立ち上げたままネットワークを移動するような場合は on にすると良いです。
config.vm.provider :virtualbox do |vbox| vbox.customize ['modifyvm', :id, '--natdnsproxy1', 'off'] end
上記設定と似ていますが、この設定を on にすると、ゲストは自分自身のリゾルバを使用せず、ホストのリゾルバを使用して名前解決をします。
config.vm.provider :virtualbox do |vbox| vbox.customize ['modifyvm', :id, '--natdnshostresolver1', 'off'] end
Vagrantfile の設定を外部ファイルで制御する
Vagrantfile は Git リポジトリでバージョン管理されるファイルです。
しかし、利用者ごとに異なるユーザー名やパスワードなどは Git リポジトリにコミットしたくないので、Vagrantfile に直接書くのは避けたいです。
.yml ファイルを読み込む
Vagrant プラグインは不要です。 Ruby 標準添付の yaml ライブラリだけで実現できます。
例えば、次の yml ファイルを読み込むには
A: aaa B: B1: bbb1 B2: bbb2 C: ccc
Vagrantfile に以下のように記述します。
require 'yaml' vm_config = YAML::load_file('config.yml') vm_config['A'] == 'aaa' vm_config['B']['B2'] == 'bbb2'
その他の方法
dotenv を Vagrant のプラグインとしてインストールしておき、.env ファイルに設定を書く方法や、vagrant-secret プラグインを利用する方法などがあるようです。
プラグインがインストールされているかチェックする
vagrant-omnibus などの必須プラグインがインストールされていない場合に、そのまま vagrant up を実行してしまうと Ruby のスタックトレースが表示され、vagrant up が失敗します。
スタックトレースを見ても、ユーザーはどうしてそれが失敗したのか判断できない場合が多いです。
必要なプラグインは事前にチェックできるように Vagrantfile に処理を書いておくとよいです。
unless Vagrant.has_plugin?('vagrant-omnibus') then raise 'vagrant-omnibus プラグインがインストールされていません。' end
Chef プロビジョナ
Cookbook のパスを指定する
cookbooks_path に Cookbook が格納されているディレクトリへの相対パスをリストで指定します。
Vagrant では指定したパスにディレクトリが存在しない場合でも何事も無くプロビジョンをしようと
してしまうので、事前にチェックするようにしています。
config.vm.provision :chef_solo do |chef| cookbooks_path = ['cookbooks', 'site-cookbooks'] cookbooks_path.each do |dir| unless File.exists?(dir) then raise "cookbook_path (#{File.absolute_path(dir)}) is not found." end end chef.cookbooks_path = cookbooks_path end
SSL の警告を抑制する
Chef プロビジョナの実行時に次のような警告が表示されることがあります。
SSL validation of HTTPS requests is disabled. HTTPS connections are still encrypted, but chef is not able to detect forged replies or man in the middle attacks.
Chef 11.12.0 から SSL 証明書のチェックをするようになったようで、
そのチェック方法(ssl_verify_mode)がデフォルトの :verify_none のままになっていると
この警告が表示されます。
Vagrant でこれを解決するには、この設定を行う外部ファイルを作成し、
Vagrantfile の Chef プロビジョナでそのパスを指定するといいようです。
Chef::Config.ssl_verify_mode = :verify_peer
config.vm.provision :chef_solo do |chef| chef.custom_config_path = 'Vagrantfile.chef' end
他の Chef や Ruby がインストールされている環境でプロビジョンする
ゲストマシンに GEM_PATH などが指定されているとき、プロビジョニングがうまくいかない場合があります。
これを回避するには、Chef プロビジョナに Chef のバイナリパスと環境変数を指定します。
config.vm.provision :chef_solo do |chef| chef_gem_path = "/opt/chef/embedded/lib/ruby/gems/1.9.1" chef.binary_env = "GEM_PATH=#{chef_gem_path} GEM_HOME=#{chef_gem_path}" chef.binary_path = "/opt/chef/bin" end