この記事のサマリ
Vagrantでboxを取得する際に、ネットワークに接続せずにディレクトリから直接取得したい場合は、スキーム名に「file」を指定して、file://[ディレクトリ]のように指定すると実現できます。
対象読者
例えば、プロジェクト等でvagrantを利用していて、メンバー全員がhttpで外部にboxを取得するのは、ネットワーク負荷的にもネチケット的にも避けたいような場合で、共有ディレクトリにboxを置いて管理してみようかなといった方を対象としています。
動作確認バージョン
vagrant version
の結果↓
Installed Version: 1.7.4
経緯
vagrantを、チームのみんなに使ってもらうといった場合に、ネットワークに負荷がかるの嫌だなぁと思い、何か対策が無いかなぁと思って、考えた案の一つです。
ローカルにあるboxをVagrantfileから自動的に読み込む
Vagrantでは、boxと呼ばれる仮想マシンをパッキングしたものを利用します。boxは、自分でカスタマイズしたものを作成することもできますが、以下のサイトに有志の方々が良く使うboxを公開してくださっています。
-
http://www.vagrantbox.es/
通常boxを利用する場合、以下のような流れで仮想マシンを起動します。
1.「vagrant init <boxの名前(1)> <boxの取得先URL(2)>」というコマンドで、Vagrantfileを作成
2.「vagrant up」というコマンドで、(1)で指定した名前のboxがVagrant本体に登録済み出なかった場合は、(2)で指定したURLからboxをダウンロードし、Vagrant本体に(1)の名前でboxを登録
ダウンロードされるのは、最初の1回だけですので、個人で利用する分には、(2)で外部にhostingされているサイトからダウンロードして実行するで問題ありません。
しかし、大規模なシステム開発を対象とした場合、全員がboxをダウンロードするのは、ネットワーク負荷を考えると、よろしくありません。
上記負荷を避けようとした場合、たとえば共有ファイルサーバなどにboxを配置してLANに閉じて作業をするといった対策案が挙げられます。
具体的には、Vagrantfileを以下のように設定することで、実現可能です。(下記の例は、ローカルマシンにダウンロードしたboxを利用していますが、ネットワークドライブを指定することも可能です。)
# centos64_6_5という名前のboxが無かったら、
#./box/opscode_centos-6.5_chef-provisionerless.boxからboxを登録して利用する
Vagrant::Config.run do |config|
config.vm.box = "centos64_6_5"
config.vm.box_url = "file://./box/opscode_centos-6.5_chef-provisionerless.box"
end
上記のように、box_urlに、「file://」+「boxへのファイルパス」と記述してあげるのがポイントです。こうすれば、ローカルのファイルやネットワークドライブのファイルを直接参照することができます。(LAN内にwebサーバを建てて、boxをhostingする必要もありません。)