Vagrantのboxを共有する

インターネットでの共有

Vagrantの開発元でもあるHashiCorpがAtlasというサービスを提供しています。

これを使うと、Vagrantのboxをアップロードし、共有することができます。コストもかからないし、バージョン管理もできちゃいます。

Atlasに登録したものは、そのまま名前を指定すると仮想マシンを立ち上げられます。

vagrant init onozaty/redmine-3.2
vagrant up

とても便利ですね!

インターネットに公開できない場合

インターネット上に公開できないようなものの場合だと、Atlas使えないのでちょっと面倒です。

ファイルサーバなどでboxを共有する

みんなが参照可能な場所にboxを配置し、vagrant init時にURLを指定します。

vagrant init testapp file:////server/vagrant/testapp.box
vagrant up

ちなみに、上記は下記と同じです。

vagrant box add testapp file:////server/vagrant/testapp.box
vagrant init testapp
vagrant up

場所を周知するだけなので、そこまで面倒ではありませんが、あんまりパスを入力したくないですよね、、

boxの場所が書かれたVagrantfileを配布する

ということで、パスを入力するのが嫌なので、別の方法としてVagrantfileを配布する方法があります。

Vagrantfileには、boxのURLが書けて、boxとして登録されていない場合には、そのURLからboxを取得して登録してくれます。 (vagrant init <box名> <URL>でVagrantfile作った時にも同様のVagrntfileが作られています)

  • Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "testapp"
  config.vm.box_url = "file:////server/vagrant/testapp.box"
end

これならば、配布されたVagrantfileを置いたディレクトリで

vagrant up

で終了です。

バージョン管理をする

Vagrantには、boxに対してバージョンを付与し、boxをアップデートする仕組みが用意されています。(Atlasでは、アップロード時にバージョンも記入するので、その情報を元に最新があるかどうかを返してくれています)

jsonファイルにて記載します。バージョンの情報として、バージョン毎のbox取得先URLが記載されています。

  • testapp.json
{
  "description": "Test",
  "short_description": "Test",
  "name": "testapp",
  "versions": [{
    "version": "1.0.0",
    "status": "active",
    "description_html": "<p>Test App</p>",
    "description_markdown": "Test App",
    "providers": [{
      "name": "virtualbox",
      "url": "file:////server/vagrant/testapp-1.0.0.box"
    }]
  },
  {
    "version": "1.1.0",
    "status": "active",
    "description_html": "<p>Test App</p>",
    "description_markdown": "Test App",
    "providers": [{
      "name": "virtualbox",
      "url": "file:////server/vagrant/testapp-1.1.0.box"
    }]
  }]
}

boxのURLとして、上記のjsonファイルを指定します。

vagrant box add file:////server/vagrant/testapp.json
vagrant init testapp
vagrant up

こうすると、jsonに書かれた最新のバージョンを使って立ち上がります。

boxがアップデートされた時には、jsonのファイルを修正すると、vagrant upの時に、新しいものがあることを伝えるメッセージが出ます。

>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'testapp' is up to date...
==> default: A newer version of the box 'testapp' is available! You currently
==> default: have version '1.1.0'. The latest is version '1.2.0'. Run
==> default: `vagrant box update` to update.

vagrant box updateでboxが更新できます。

vagrant box update --box testapp

jsonファイルもconfig.vm.box_urlに指定できるので、Vagrantfileを配布するような方法も取ることができます。