Vagrantfile の書き方
Vagrant の基本的な設定
ベース box やネットワーク、共有ディレクトリなどの設定を記述します。
目次 |
---|
VirtualBox の VM を細かく設定する
VirtualBox の設定は virtualbox プロバイダの設定で行います。
VirtualBox プロバイダの customize メソッドは VirtualBox の VBoxManage コマンドを経由して、
これから起動しようとしている VM のあらゆる設定を行います。
たとえば、メモリサイズを変更する場合は次のように書きます。
コード ブロック |
---|
config.vm.boxprovider = ‘sl65-x64-chefs_meeting01’ |
Provider の設定
VirtualBox の VM の CPU コア数やメモリサイズなどの設定を記述します。
:virtualbox do |vbox|
vbox.customize ['modifyvm', :id '--memory', '4096']
end |
VBoxManage コマンドの詳細は VirtualBox のドキュメント を確認してください。
メモリサイズや CPU コア数を設定する
仮想マシンの基本的なリソースもここで設定できます。
コード ブロック |
---|
config.vm.provider :virtualbox do |vbox| # メモリサイズ vbox.customize [‘modifyvm’'modifyvm', :id, ‘'--memory’memory', '20484096'] # CPU 利用率の制限 vbox.customize [‘modifyvm’'modifyvm', :id, ‘'--cpus’cpuexecutioncap', '280'] end |
設定項目などは VirtualBox のドキュメント [ https://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvm ] を参照するとわかると思います。
Provisioner の設定
...
# 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.provisionprovider :chef_solovirtualbox do |chefvbox| # cookbookクリップボード共有の設定 のあるディレクトリの相対パスを指定 chef.cookbooks_path = [‘cookbooks’, ‘site-cookbooks’] # 実行する Recipe を指定 chef.run_list = [ ‘java’, ‘eclipse’ ] # Attribute を指定 chef.json = { java: {}, eclipse: {} } |
ヒント | ||||||||
---|---|---|---|---|---|---|---|---|
Vagrant + Chef のディレクトリ構成
|
jenkins Cookbook を Vagrant で
Cookbook を配置
作成した jenkins Cookbook をsite-cookbooks ディレクトリに配置します。
コード ブロック |
---|
|- cookbooks/
`- site-cookbooks/
`- jenkins/ |
Vagrantfile を編集
jenkisn Cookbook の default Recipe を実行するように、Provisioner の設定を編集します。
Attribute も指定してみてください。
プロビジョニングを実施
vagrant のコマンドで、プロビジョニングを行います。
コード ブロック |
---|
$ vagrant provision |
うまくいけば、起動中の VM 上で Jenkisn サービスが起動します。
http://localhost:8080/ で Jenkins にアクセスしてみてください。
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 |
yum や Chef の remote_file でダウンロードしたファイルをホストにキャッシュする
vagrant-cachier プラグインを使用します。
このプラグインを使用すると、ホストマシンのディレクトリが /var/cache/yum や Chef::Config[:file_cache_path] に
マウントされ、Box 単位、または Vagrant up する VM 単位で永続化されます。
利用するには、vagrant-cachier プラグインのインストールが必要です。
コード ブロック |
---|
$ vagrant plugin install vagrant cachier |
Vagrantfile では vagrant-cachier プラグインがインストールされている場合に、
キャッシュする単位とキャッシュするモノを指定します。
コード ブロック |
---|
if Vagrant.has_plugin?('vagrant-cachier') then
# Box 単位でキャッシュする
config.cache.scope = :box
# Chef と yum のファイルをキャッシュする
config.cache.enable :chef
config.cache.enable :yum
end |
注意 |
---|
このプラグインで Chef::Config[:file_cache_path] をキャッシュする場合は、
|