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 ] を確認してください。
仮想マシンの基本的なリソースもここで設定できます。
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 コア数を変更できない場合もあります。
クリップボードや入力インタフェースも同じように設定できます。
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 は Git リポジトリでバージョン管理されるファイルです。
しかし、利用者ごとに異なるユーザー名やパスワードなどは Git リポジトリにコミットしたくないので、Vagrantfile に直接書くのは避けたいです。
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 |
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 |
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 |
ゲストマシンに 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 |