【Vagrantドキュメント意訳】13.プロバイダ



# プロバイダ

Vagrantは[VirtualBox](https://www.virtualbox.org/)、 [Hyper-V](https://www.microsoft.com/hyper-v)や [Docker](https://www.docker.io/)をサポートしたBoxを出力すると同時に、ほかのマシンの種類も管理する能力がある。これは、Vagrantで他の*プロバイダ*を使用することで行われる。

プロバイダの変更は、より多くの異なる機能を提供することができる。例えば、実業務用にVagrantを使用している場合、十分なサポートと、一般的にVirtualBoxと比較して安定的でパフォーマンスに優れることから[VMware](https://www.vmware.com/)プロバイダが推奨される。

他のプロバイダが使用可能となる前に、そのプロバイダをインストールする必要がある。プロバイダのインストールはVagrantプラグイン・システムを介して行われる。

一度プロバイダがインストールされれば、Vagrantに望むのと同様に、使用方法は簡単で単純である。より詳細な情報は左にあるナビゲーションの中から関連のある箇所を見つけて参照すること。

# プロバイダのインストール

プロバイダはVagrantのプラグインとして提供されており、[標準的なプラグインのインストール手順](https://www.vagrantup.com/docs/plugins/usage.html)を使用することでインストールされる。プロバイダを含むプラグインをインストールした後、プロバイダはすぐに使用可能となる。

# 基本的なプロバイダの使い方

## Box

VagrantのBoxはそれぞれのプロバイダ専用である。VirtualBox用のBoxはVMware Fusionプロバイダやその他のいかなるプロバイダに対しても非互換である。Boxはそれぞれのプロバイダに対してインストールされる必要があり、プロバイダが異なりさえすればほかのBoxとして同じ名前で共有することができる。そのため、"precise64"のBoxとしてVirtualBoxとVMwareの両方を持つことができる。

Boxのインストールは全く変わりはない。

```bash
$ vagrant box add \
  precise64 https://files.hashicorp.com/precise64.box
```

Vagrantは自動的にどのプロバイダ向けのBoxであるかを検出する。これはBoxの一覧を表示したときに見ることができる。Vagrantは、以下に示すように名前に続けてカッコ内にプロバイダを表示する。

```bash
$ vagrant box list
precise64 (virtualbox)
precise64 (vmware_fusion)
```

## Vagrantの起動

一度プロバイダがインストールされると、`--provider`フラグとともに`vagrant up`を呼び出すことで、それを使用することができる。これで特定のプロバイダを使用することができる。ほかの設定は必要ないのである。

日常の使用方法では、Vagrantはたいてい適切なプロバイダを使おうとするので、`--provider`フラグは必須ではない。以下に使い方の詳細を示す。

```bash
$ vagrant up --provider=vmware_fusion
```

`--provider`フラグを指定すれば、`up`コマンドに対してする必要のあるのはこれだけである。一度マシンが立ち上がって動作すれば、Vagrantはマシンの稼働の裏にあるプロバイダを見ることができる。そのため`destroy`や`suspend`などのコマンドに、どのプロバイダを使っているかを教える必要はない。

> Vagrantは現在は一つのマシンあたり一つのプロバイダで起動するように制限している。もしマルチ・マシン環境を持っていた場合、例えば、一つのマシンをVirtualBoxで起動する一方で、もう一つのマシンでVMware Fusionで起動することができる。しかし、同じマシンでVirtualBoxとVMware Fusionの両方で起動することはできない。この制限はVagrantの将来的なバージョンにおいてなくなるであろう。

## デフォルト・プロバイダ

先にふれたように、通常、*毎回*`--provider`を指定する必要はない。Vagrantは、与えられた環境に対して望まれるプロバイダを検出するほど十分に賢い。

Vagrantは次に示す順番で、デフォルトのプロバイダを見つけ出そうとする。

1. 存在するならば`vagrant up`に対する[`--provider`](https://www.vagrantup.com/docs/providers/basic_usage.html#_provider)フラグがほかのすべてより優先される。
2. [`VAGRANT_DEFAULT_PROVIDER`](https://www.vagrantup.com/docs/providers/basic_usage.html#VAGRANT_DEFAULT_PROVIDER)環境変数が設定されていれば、次の優先順位となり、プロバイダとして選択される。
3. VagrantはVagrantfile内で呼ばれているすべての[`config.vm.provider`](https://www.vagrantup.com/docs/providers/basic_usage.html#config_vm_provider)確認し、順番に従って試し、使用可能な最初のプロバイダが選択される。例えば、Hyper-Vを設定したとき、Macではこの方法では決して選択されない。設定し、かつ、使用可能である必要がある。
4. Vagrantは、インストールされているすべてのプロバイダ・プラグイン(Vagrantに同梱されたものも含む)を確認し、使用可能と判断された最初のプラグインを見つける。システムの優先度をもっている。優先度の低いシステムより優先度のより高いシステムを知っているということである。例えば、VMwareプロバイダがインストールされている場合、それは常にVirtualBoxよりも高い優先度が与えられる。
5. Vagrantが使用可能なプロバイダを見つけられなかった場合、エラーとなる。

この方法を使うことで、Vagrantが適切なプロバイダを見つけられないということは非常にまれである。これは、それぞれの[Vagrantfile](https://www.vagrantup.com/docs/vagrantfile/)が、その開発環境のプロバイダが何であるかを、プロバイダ定義順によって定義することもできる。

からくりは、サポートする適切なプロバイダの順番を定義する為にVagranfileの先頭に設定することなく`config.vm.provider`を使用することにある。

```
Vagrant.configure("2") do |config|
  # ... other config up here

  # Prefer VMware Fusion before VirtualBox
  config.vm.provider "vmware_fusion"
  config.vm.provider "virtualbox"
end
```

# 設定

Vagrantのプロバイダが行儀よく、健全なデフォルトをもつVagrantfileで動作すると同時に、プロバイダは通常、それぞれのプロバイダを使いこなすための独特な設定オプションを公開している。

このプロバイダ特有の設定は、可搬性があり、使うのが容易で、理解するのも容易であり、Vagrantfileで行われる。


## 可搬性

一つの重要な事実として、Vagrantfile内でほかのプロバイダの設定をしたとしても、Vagrantfileはそのプロバイダをインストールする必要性のない個人に対する、移植の可能性を維持する。

例えば、VMware Fusionを設定し、VMware Fusionプロバイダを持っていない、ある個人に送付したとしても、Vagrantは設定の一部を何も言わず無視しようとする。

## プロバイダの設定

特定のプロバイダの設定はこのようになる。

```bash
Vagrant.configure("2") do |config|
  # ...

  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
  end
end
```

マルチ・プロバイダの設定のために、複数の`config.vm.provier`ブロックが存在できる。

設定の書式は、プロビジョナの設定方法と非常に似ている。`config.vm.provider`は一つのパラメータを取る。プロバイダが設定される名前である。そして、プロバイダを設定するのに使用される、カスタム設定オプションと共に内部ブロックが現れる。

この内部設定はプロバイダ毎に異なる。使用可能な設定オプションを確認するために、選択したプロバイダのドキュメントを読むことをおすすめする。

幾つかのプロバイダは、プロバイダ特有の設定を必須とせず、Boxの外で直接動作することを覚えておいて欲しい。プロバイダ特有の設定は、選択したプロバイダの最大限をえるために、より多くのオプションを公開する方法であることを意味する。特定のプロバイダに対して、稼働するために障害となるという意味ではない。

## 設定の上書き

プロバイダは、`config.vm.box`やその他のVagrantの設定項目などの、プロバイダ特有ではない設定を上書きすることも出来る。これは`config.vm.provider`の２つ目の引数を使用することで行われる。この引数は通常の`config`と同じように、設定したい何かを設定すると、そのプロバイダに対してのみ上書きを行う。

例。

```bash
Vagrant.configure("2") do |config|
  config.vm.box = "precise64"

  config.vm.provider "vmware_fusion" do |v, override|
    override.vm.box = "precise64_fusion"
  end
end
```

上記の場合、Vagrantはデフォルトでは"precise64"のBoxを使用するが、使用しているプロバイダがVMware Fusionであれば、"precise64_fusion"を使用する。

> **Vagrantのやり方** 適切な"Vagrantのやり方”は、Boxの名前はマルチ・プロバイダに対応付けすることができるので、マルチ・プロバイダを作る際に可能であれば、プロバイダ特有の上書きを避ける。しかしながら、これは常に可能ではないので、そのような場合にのみ、上書きを使用することが出来る。

# デフォルト・プロバイダ

デフォルトでは、VirtualBoxがVagrantにとってのデフォルト・プロバイダである。VirtualBoxはいまだに、Vagrantを使用するための最も入手しやすいプラットフォームである。それは無料であり、クロス・プラットフォームであり、さらに、数年間にわたるVagrantのサポートが行われている。デフォルト・プロバイダとしてのVirtualBoxは、Vagrantと共に始める新しいユーザにって、あたえる障壁がとても低い。

しかしながら、Vagrantを使用したあと、むしろデフォルトのプロバイダとして他のプロバイダを使用することを選ぶかもしれない。事実、これはまさに一般的である。この経験をより良くするために、Vagrantは`VAGRANT_DEFAULT_PROVIDER`環境変数を設定することでデフォルト・プロバイダを指定できるようにしている。

デフォルトにしたいプロバイダを`VAGANT_DEFAULT_PROVIDER`を設定するだけである。たとえば、VMware FusionをVagrantとともに使用したいならば、環境変数を`vmware_fusion`に設定する事ができ、そして、それがデフォルトとなる。

# VirtualBox

Vagrantは、無料のクラス・プラットフォーム・コンシューマ仮想化製品である[VirtualBox](https://www.virtualbox.org/)をサポートしている。

VirtualBoxプロバイダはVirtualBoxのバージョン4.0.x、4.1.x、4.2.x、4.3.x、5.0.xと互換性がある。その他のバージョンはサポート対象外であり、プロバイダはエラーメッセージを表示するだろう。

VirtualBoxはプロバイダを使用する前に、単独でインストールされなければならない。そうでなければ、プロバイダはそれをインストールことを尋ねるエラーメッセージを表示する。VirtualBoxはオペレーティング・システムにあったパッケージ、または、インストーラを[ダウンロード](https://www.virtualbox.org/wiki/Downloads)し、そのパッケージをインストールするための標準的な方法でインストールすることが出来る。

VirtualBox特有のもっと詳しい情報は左のナビゲーションを使うことで見つけることが出来るだろう。

## 使い方

VagrantのVirtualBoxプロバイダは他のプロバイダと同じ様に使う。プロバイダに対する一般的な[基本的な使い方](https://www.vagrantup.com/docs/providers/basic_usage.html)のページ

`--provider`フラグに対して使用する値は`virtualbox`である。

VagrantのVirualBoxプロバイダは、現時点では、2重起動はサポートしていない。`--parallel`オプションを指定しても、何も影響を与えられない。

## Base Boxの生成

[すべてのVagrantプロバイダ](https://www.vagrantup.com/docs/providers/basic_usage.html)と同様に、VagrantのVirtualBoxプロバイダは、Base Boxの作り方に影響を及ぼす、カスタムBoxフォーマットを持っている。

これを読み進める前に、[Base Boxの作成に関する一般的なガイド](https://www.vagrantup.com/docs/boxes/base.html)を呼んでおくこと。実際、Base Boxを生成する際に非常に頻繁に参照する事になるので、分離したタブ上でこれを開いておくのは非常に有用であろう。そのページにはBoxでインストールするソフトウェアの共通的で重要な情報が含まれている。

加えて、[Boxファイルのフォーマットの基本](https://www.vagrantup.com/docs/boxes/format.html)を理解するために助けとなるだろう。

> **上級者向け！** Vagrantを始めたばかりのユーザは理解する必要が無いので、これは当然、上級者向けの話題である。もしVagrantを始めたばかりであるならば、ここは飛ばして、手に入るBoxを使用すること。Vagrantを十分経験したユーザで、かつ、自身のカスタムBoxを生成したいならば、ここはあなたのための記事である。

### 仮想マシン

VirtualBoxで生成された仮想マシンは、好みに応じて設定を使用することができるが、Vagrantはいくつかのハード的な必須事項がある。

* 第一のネットワーク・インタフェース(アダプタ 1)はNATアダプタであること。Vagrantはこれを第一の接続として使用する。
* 第一のネットワーク・インタフェース(NATアダプタ)のMACアドレスを記録しておくこと。[`config.vm.base_mac`](https://www.vagrantup.com/docs/virtualbox/boxes.html#config_vm_base_mac)の値として、後にVagrantfileの中に記載する必要が有るためである。この値を見るにはVirtualBox GUIを使用する。

上記にそっていれば、好みに応じてBase仮想マシンをカスタマイズするのは自由である。

### 追加ソフトウェア

[Base Boxの作成に関する一般的なガイド](https://www.vagrantup.com/docs/boxes/base.html)にもとづいてインストールされるソフトウェアに加えて、VirtualBox Base Boxはいくつかの追加ソフトウェアを必須とする。

#### VirtualBox Guest Additions

共有フォルダなどが機能するために[VirtualBox Guest Additions](https://www.virtualbox.org/manual/ch04.html)をインストールする必要がある。Guest Addtionsのインストールは、VirtualBoxで稼働するうえでゲストOSを最適化するために、パフォーマンスの改善も期待できる。

Guest Additionsをインストールする前に、LinuxのKernelヘッダと基本的な開発ツールが必要となる。Ubuntuの場合、以下のように簡単にインストールできる。

```bash
$ sudo apt-get install linux-headers-$(uname -r) build-essential dkms
```

##### GUIでのインストール方法：

次に、GUIで"Devices"-"Install Guest Additions"を使って、Guest Additionsのイメージを確認する。その後、任意の場所にCD-ROMをマウントする。たいてい、このようになるだろう。

```bash
$ sudo mount /dev/cdrom /media/cdrom
```

最後にGuest Additionsをインストールするための、システムに対応したシェル・スクリプトを実行する。例えば、X86上のLinuxであれば次のようになるだろう。

```bash
$ sudo sh /media/cdrom/VBoxLinuxAdditions.run
```

コマンドの実行が成功すれば、Guest Additionsがインストールされたということである。

##### コマンドラインでのインストール方法：

適切なバージョンを[ここ](http://download.virtualbox.org/virtualbox/)から選択することで、VirtualBoxのバージョンに対応したGeust Additionsを見つけることが出来るだろう。以下の例では、執筆時点でのVirtualBoxの最新バージョンである4.3.8を使用している。

```bash
wget http://download.virtualbox.org/virtualbox/4.3.8/VBoxGuestAdditions_4.3.8.iso
sudo mkdir /media/VBoxGuestAdditions
sudo mount -o loop,ro VBoxGuestAdditions_4.3.8.iso /media/VBoxGuestAdditions
sudo sh /media/VBoxGuestAdditions/VBoxLinuxAdditions.run
rm VBoxGuestAdditions_4.3.8.iso
sudo umount /media/VBoxGuestAdditions
sudo rmdir /media/VBoxGuestAdditions
```

オペレーティング・システムをインストールしたときに、サイズが減らせると勧められたためにデスクトップ環境をインストールしなかった場合、OpenGLやウィンドウ・システム・ドライバがないことについて、VirtualBox Additionsが警告するが、これは安全に無視することができる。

コマンドが成功すれば、Guest Additionはインストールできているだろう。

### Boxのパッケージ化

VagrantはVirtualBoxのBase Boxをパッケージ化するための簡単な方法を持っている。インストールしようと思うすべてのソフトウェアを一度インストールすれば、このコマンドを実行することができる。

```bash
$ vagrant package --base my-virtual-machine
```

"my-virtual-machine"はBase Boxとしてパッケージ化するためのVirtualBox内の仮想マシンの名前で置き換えること。

数分で完了し、"package.box"というファイルが新たなBase Boxとして作業用ディレクトリに配置されるだろう。この時点で、Base Boxの生成に成功したのである。

### 素の中身

このセクションでは、Boxファイルの実際の素の中身について示す。これはBase Boxの生成時に有用なわけではないが、必要に応じて問題をデバッグする際に有用である。

VirtaulBoxのBase BoxはVirtualBox仮想マシンを[エクスポート](https://www.virtualbox.org/manual/ch08.html#vboxmanage-export)したファイルの結果のアーカイブである。それらのBoxが含むものの例を示す。

```bash
$ tree
.
|-- Vagrantfile
|-- box-disk1.vmdk
|-- box.ovf
|-- metadata.json

0 directories, 4 files
```

VirtualBox仮想マシンからエクスポートされたファイルに加えて、Vagrant自身によって使用される"metadata.json"ファイルがある。

また、"Vagrantfile"もある。これは、機能が適切に動作する為に接続できるよう、VirtualBoxがこれを必須としているので、NATネットワーク・デバイスのMACアドレスを適切に設定するためのいくつかの設定を含んでいる。もし、上記のように`vagrant package --base`を使用しなければ、このVagrantfileの`config.vm.base_mac`の設定として、コロンなしのNATデバイスのMACアドレスを設定する必要がある。

VirtualBoxで起動した時、Vagrantは、Box内にある"box.ovf"を[インポートする](https://www.virtualbox.org/manual/ch08.html#vboxmanage-import)。

## 設定

VirtualBoxプロバイダは、Vagrant環境で動作するVirtualBoxをよりうまく制御できるように、いくつかの追加的な設定オプションを公開している。

### GUI 対 ヘッドレス

デフォルトでは、VirtualBoxマシンはヘッドレス・モードで起動する。これはホスト・マシン上にマシン用のUIが表示されないことを示す。時々、UIが欲しくなる時があるだろう。マシンの中で動いているブラウザを見るために待ったり、起動時の奇妙な問題をデバッグしたり、それらを含む共通の事例である。GUIとともに起動するようにVirtualBoxのプロバイダに教えてやるのは簡単である。

```bash
config.vm.provider "virtualbox" do |v|
  v.gui = true
end
```

### 仮想マシン名

`name`プロパティに設定することで、VirtualBoxのGUIで見える名前をカスタマイズすることが出来る。デフォルトでは、VagrantはVagrantfileがあるフォルダと、マシンが生成されたタイムスタンプを連結して設定する。他の名前を設定することで、より簡単に仮想マシンを識別することが出来るだろう。

```bash
config.vm.provider "virtualbox" do |v|
  v.name = "my_vm"
end
```

### リンクド・クローン

デフォルトでは、新しいマシンはBase Boxからインポートすることで生成される。巨大なBoxに対して、これは（インポート操作に対する）時間的、（Base Boxのイメージのコピーを新しいマシン内に含むための）領域的に巨大なオーバーヘッドを生み出す。リンクド・クローンを使用することでこのオーバーヘッドは劇的に減らすことが出来る。

リンクド・クローンは、初めの要求された一初回だけにBase Boxをインポートすることで生成される、マスター仮想マシンにもとづいている。リンクド・クローンに対するディスク・イメージの差分だけが、マスター仮想マシンに属する親ディスクイメージに生成される。

```bash
config.vm.provider "virtualbox" do |v|
  v.linked_clone = true
end
```

後方互換性を考慮すると

```bash
config.vm.provider 'virtualbox' do |v|
  v.linked_clone = true if Vagrant::VERSION =~ /^1.8/
end
```

後方互換性を考慮したくない、またはユーザにリンクド・クローンのサポートを強制したいならば、`Vagrant.require_version`を1.8として使用することが出来る。

> **注意：**マスター仮想マシンの生成は、現在Vagrantによって自動的に削除されない。これは手動で行う必要がある。しかしながら、マスター仮想マシンは、それに関連付けられたリンクド・クローンがない場合のみ削除することが出来る。

### VBoxManageのカスタマイズ

[VBoxManage](https://www.virtualbox.org/manual/ch08.html)は、コマンドラインからVirtualBoxの仮想マシンの変更を行うために使用することができるユーティリティである。

Vagrantはマシンが起動する直前にVBoxManageに対するコマンドを呼び出す方法を公開している。

```bash
config.vm.provider "virtualbox" do |v|
  v.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
end
```

上位の例で、仮想マシンのCPU実行上限がホストの50％となるように変更される。仮想マシンでどれだけCPUが使用されていたとしても、ホストマシンの50％を超えることがないことを意味する。いくつか詳細を示す。

* [`:id`](https://www.vagrantup.com/docs/virtualbox/configuration.html#_id)は、特別なパラメータであり、仮想マシンが生成された際のIDと置き換えられる。VBoxManageコマンドがIDを要求した際に、この特別なパラメータを受け渡すことができる。
* 複数の[`customize`](https://www.vagrantup.com/docs/virtualbox/configuration.html#customize) ディレクティブが使用できる。与えた順に実行される。

メモリやCPUの設定用に、いくつかの便利なショートカットがある。

```bash
config.vm.provider "virtualbox" do |v|
  v.memory = 1024
  v.cpus = 2
end
```

## ネットワーク

### VirtaulBox内部ネットワーク

VagrantのVirtualBoxプロバイダはVirtualBoxの[internal network](https://www.virtualbox.org/manual/ch06.html#network_internal)としてプライベート・ネットワークを使用することをサポートしている。デフォルトでは、簡単に動作するので、プライベート・ネットワークはホスト・オンリー・ネットワークである。しかしながら、内部ネットワークも同じように有効化することができる。

VirtualBoxの内部ネットワークとしてプライベート・ネットワークを指定するために、ネットワークのオプションンに`virtualbox__intnet`を使用する。`virtualbox__` (2つのアンダースコア)プリフィックスがVagrantにこのオプションはVirtualBoxプロバイダに対してのみであることを教える。

```bash
Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4",
    virtualbox__intnet: true
end
```

加えて、VirtualBoxプロバイダを特定の内部ネットワークに参加させたい場合、その内部ネットワークの名前を指定する。

```bash
Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4",
    virtualbox__intnet: "mynetwork"
end
```

### VirtualBox NICタイプ

`nic_type`パラメータを使用することで、生成したネットワーク・インタフェースに対して特定のNICタイプを指定することができる。レガシーな理由から、これには`virtualbox__`プレフィックスがついていないが、VirtualBox特有である。

これは上級オプションであり、ネットワークデバイスがまったく動作しなくなる可能性があるので、何を使用しているか知っている場合にのみ使用するべきである。

例：

```bash
Vagrant.configure("2") do |config|
  config.vm.network "private_network", ip: "192.168.50.4",
    nic_type: "virtio"
end
```

## 共通の課題

ここでは、VagrantとVirtualBoxを稼働する際に出会うであろういくつかの共通的な課題を示し、あわせてそれらに対する解決方法も示す。

### Windowsを待っている

VagrantコマンドがWindowsを待っている場合、それはVirtualBoxと通信しているためであり、これはVirtualBoxの権限の問題が引き金となっている。これを改善するのは簡単である。通常のユーザまたは管理者ユーザとしてVirtualBoxを開始することで、他の方法を使用することを回避できるだろう。VirtualBoxと対話するVagrantは、Vagrantを実行しているコンソールと同じアクセス・レベルであるべきだという点を覚えておいて欲しい。

この問題が解決するために、すべてのVirtualBoxマシンとGUIを完全に停止する。そして、使うべきアクセス・レベルでVirtualBoxを起動する。

### DNSが動作しない

仮想マシンでDNSが動作しない場合、(VirtualBox組み込みの)DNSプロキシを有効にする必要がある。どのようにすべきかは[ここのStackOverflowの回答を参照](https://serverfault.com/questions/453185/vagrant-virtualbox-dns-10-0-2-3-not-working)して欲しい。

# VMware

[HashiCorp](https://www.hashicorp.com/)はVagrant用の公式の[VMware Fusion](https://www.vmware.com/products/fusion/overview.html)と[VMware Workstation](https://www.vmware.com/products/workstation/)向けの[プロバイダ](https://www.vagrantup.com/docs/providers/)を開発している。このプロバイダはVagrantに、VMWareベースのマシンに強力さを与え、VMwareソフトウェアが提供する、価値のある安定の優位性とパフォーマンスを加える。

[VMwareプロバイダ](https://www.vagrantup.com/vmware)についての詳細を学びたければ、VagrantのWebサイトのVMwareプロバイダを参照のこと。

このプロバイダはVirtualBoxの代わりになり得る。VagrantがサポートするすべてのVirtualBoxの機能は、同様にVMwareでも全て機能する。しかしながら、Boxのフォーマットや、設定内容などのようにVMware特有のものもある。それらはここで文書化している。

VMware FusionとVMware Workstationのサポートしているバージョンと互換性に関する日々の情報の多くに対しては、[VagrantのVMware製品ページ](https://www.vagrantup.com/vmware)を参照のこと。VMware FusionとVMware Workstationは、プロバイダを使用する前に、購入してインストールする必要のある、サードパーティー製品であることに注意して欲しい。

VMware特有の情報をより詳細に読みたければ、左側のナビゲーションを使用して探して欲しい。

## インストール

VagrantのVMwareプロバイダは、標準的なプラグインのインストール手順を用いてインストールできる。VMware Fusionユーザならば、次のようにする。

```bash
$ vagrant plugin install vagrant-vmware-fusion
```

VMware Workstationユーザならば、次のようにする。

```bash
$ vagrant plugin install vagrant-vmware-workstation
```

プラグインのインストールに関する詳細な情報については、[Vagrantプラグインの使用方法に関するドキュメント](https://www.vagrantup.com/docs/plugins/usage.html)を参照のこと。

VagrantのVMwareプラグインは、[HashiCorp](https://www.hashicorp.com/)によって提供される商用製品であり、操作するには**ライセンスの購入が必須である**。ライセンスを購入するには、[VagrantのVMwareプロバイダ](https://www.vagrantup.com/vmware#buy-now)のページを訪れること。ライセンスの購入にあたり、受信箱にライセンスファイルを受け取る。このファイルをダウンロードして、コンピュータ上の作業用の場所に保存しておくこと。

> **警告！**VagrantのVMwareプラグインライセンスとして、VMware製品ライセンスを使用することはできない。それらは異なる商品であり、それぞれのライセンスを必要とする。

正しいVagrantのVMwareプラグインをシステムにインストールしたのち、ライセンスをインストールする必要がある。VMware Fusionユーザであれば、

```bash
$ vagrant plugin license vagrant-vmware-fusion ~/license.lic
```

VMware Workstationユーザであれば、

```bash
$ vagrant plugin license vagrant-vmware-workstation ~/license.lic
```

第一のパラメータはプラグインの名前であり、第二のパラメータはディスク上のライセンス・ファイルへのパスである。ライセンス・ファイルをディスクに保存した際の作業用のパスで`~/license.lic`を置き換えること。プラグイン・ライセンスをインストールできれば、作業用のファイルは削除してかまわない。

ライセンスのインストールを検証するには、以下を実行する。

```bash
$ vagrant plugin list
```

ライセンスが正しくインストールされていなければ、エラーメッセージが表示されるだろう。

### よくある質問

**Q：VagrantのVMwareプラグイン・ライセンスを購入したが、emailが届かない？**
第一に、迷惑メールやSPAMメールのフォルダを確認すること。ライセンスは自動化されたシステムから送信されるので、emailプロバイダによってSPAMのフラグを付けられるかもしれないためである。もし、そこにもemailが見つからなければ、[サポート](support@hashicorp.com)にオリジナルのオーダー・ナンバーと合わせて問い合わせること。

**Q：ディスクにVagrantのVMwareプラグインのライセンス・ファイルを残しておく必要があるか？**
VagrantのVMwareプラグインのライセンスをインストールした後であれば、ディスクからそのコピーを削除しても安全である。Vagrantは起動時に参照する為に、その構造の内部にライセンスをコピーする。

**Q：オリジナルのemailを紛失してしまった。どこからVagrantのVMwareプラグイン・ライセンスを再度ダウンロードできる？**
[サポート](support@hashicorp.com)へ問い合わせること。**注意：**オリジナルの購入に使用したemailアドレスを使用して、サポートに問い合わせること。もし、異なるemailを使用した場合、要求したライセンスのオーナーで会うことを検証する為に質問されるだろう。

**Q：VMware製品のアップグレードを行った。今のライセンスは無効になるか？**
VagrantのVMwareプラグイン・ライセンスは購入した時点の特定のVMware製品バージョンに対して有効である。あたらしいバージョンのVMware製品がリリースされた場合、この新しいバージョンをサポートする為に、プラグインに対して重要な変更がしばしば要求される。これを理由として、VMware製品の新しいバージョンで動かすために現状のライセンスをアップグレードする必要があるだろう。購入者は[ライセンス・アップグレード・センター](https://license.hashicorp.com/upgrade/vmware2015)を訪れ、オリジナルの購入に使用したemailアドレスを入力することで、ライセンスのアップグレードの資格を確認できる。

今あるライセンスは引き続きVMware製品のすべての過去のバージョンを動かせられるだろう。今回アップデートを希望しないのであれば、VMWreのインストールを過去のバージョンにロール・バックすることができる。

**Q：VagranのVMWreプラグインはVMwareFusion/Workstationのトライアル・バージョンで動作しないのはなぜか？**
VagrantのVMware FusionとVagrantのVMware WorkstationのプラグインはVMware製品のトライアル・バージョンとは互換性がない。この不便については謝罪する。

**Q：間違ったVagrantのVMwareを誤って購入してしまった。交換可能か？**
もちろん！VagrantのVMware FusionプラグインとVagrantのVMware Workstationプラグインは異なる製品であるが、同じ価格であり、同じEULA(ソフトウェア使用許諾契約)に属する。そのため、ライセンスを交換することができる。[サポート](support@hashicorp.com)に問い合わせてほしい。

**Q：現在インストールされているVagrant VMwareプラグインをアップグレードする方法は？**
インストール・コマンドを再実行することで、最新のVagrantのVMwareプラグインへアップデートすることができる。VMware Fusionでは、

```bash
$ vagrant plugin install vagrant-vmware-fusion
```

VMware Workstationでは、

```bash
$ vagrant plugin install vagrant-vmware-workstation
```

### サポート

購入、インストール、またはVagrantのVMwareプラグインに関する質問があれば、[サポート](https://www.vagrantup.com/support.html)に問い合わせること。サポート・プロセスを迅速に行うため、できらばGistやpastebinに[Vagrantデバッグ出力](https://www.vagrantup.com/docs/other/debugging.html)をあげてほしい。これは、問題をより素早く診断するための助けとなる。

## 使い方

VagrantのVMwareプロバイダはほかのプロバイダと同じように使用する。プロバイダに対する一般的な[基本的な使い方のページ](https://www.vagrantup.com/docs/providers/basic_usage.html)を読んでおくこと。

`--provider`フラグに対して使うべき値は、VMware Fusionであれば`vmware_fusion`であり、VMware Workstationであれば`vmware_workstation`である。

VagrantのVMwareプロバイダは同時に多重実行をサポートしていない。`--parallel`オプションを指定しても、何も影響を与えない。

始めるには、VMwareのBoxを指す`Vagrantfile`を生成する。

```bash
# vagrant init hashicorp/precise64
Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
end
```

VMware Fusionユーザであれば、次のように実行する。

```bash
$ vagrant up --provider vmware_fusion
```

VMware Workstationユーザであれば、次のように実行する。

```bash
$ vagrant up --provider vmware_workstation
```

これによりVagrantに新しいVMware Fusion/Workstation仮想マシンをダウンロードし起動する。

> **注意：** 将来的に、このプロバイダは単一のvagrant-vmwareプラグインに統合される可能性がある。現時点では、WorkstationとFusionのコード・ベースが異なっているために別々のプラグインとなっている。

## Box

[すべてのVagrantのプロバイダ](https://www.vagrantup.com/docs/providers/basic_usage.html)と同様、VagnraのVMwareプロバイダはカスタムBoxフォーマットを持っている。

ここでは、自分自身のBase Boxを生成するためのフォーマットについて記載する。注意点としては、これらのBase Boxは、現在、手動で作成する必要があるという点である。Vagrantの将来的なリリースにおいて、このようなイメージを自動的に生成するための追加的な機構が提供されるだろう。

> **注意：**これはある程度上級者用の内容であるため、Vagrantを始めたばかりのユーザは理解する必要はない。もし、Vagrantを始めたばかりなのであれば、ここを飛ばして入手可能なBoxを使用すること。これはVagrantに習熟しているユーザであり、自分自身のBoxを作りたい人のためにある。

このページを読む前に、[基本的なBoxファイル・フォーマット](https://www.vagrantup.com/docs/boxes/format.html)を理解しておくこと。

### 内容

VMwareのBase BoxはVMwareの"vmwarevm"ファイルの必要な内容をアーカイブに圧縮されている。このようなBoxに何が含まれているかの例を以下に示す。

```bash
$ tree
.
|-- disk-s001.vmdk
|-- disk-s002.vmdk
|-- ...
|-- disk.vmdk
|-- metadata.json
|-- precise64.nvram
|-- precise64.vmsd
|-- precise64.vmx
|-- precise64.vmxf

0 directories, 17 files
```

VMwareマシンが機能するために、厳密に要求するファイルは、nvram、vmsd、vmx、vmxf、vmdkファイルである。

また、Vagrant自身によって使用される"metadata.json"ファイルもある。このファイルは[Boxフォーマット](https://www.vagrantup.com/docs/boxes/format.html)に記載されているデフォルト以外何も含まない。

VMwareのマシンを起動した時、Vagrantは非公開で管理された"vmwarevm"フォルダにBox内のすべての内容をコピーし、最初に見つかった"vmx"ファイルを使用してマシンを制御する。

> **Vagrant 1.8以上はリンクド・クローンをサポートしている。**それより前のVagrantのバージョンではリンクド・クローンはサポートしていない。リンクド・クローンに関する詳細な情報は、ドキュメントを参照のこと。

### インストールされたソフトウェア

VMware用のBase Boxは、最小構成として以下に示すソフトウェアがインストールされる必要がある。

* 鍵認証方式のSSHサーバ。デフォルトのVagrantの設定でBoxを動かしたいのであれば、SSHユーザがVagrantに搭載されている、 ユーザは[非安全な鍵ペア](https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub)を受け入れるようにしておく必要がある。
* 共有フォルダが機能するための[VMware Tools](https://kb.vmware.com/kb/340)。ネットワークのパフォーマンスが向上するなど、他にも大きな恩恵を受けることができる。

### Boxのサイズの最適化

Boxをパッケージ化する前に、可能な限りハード・ドライブを圧縮しておくべきである。これは VMwareFusionの場合、`/Applications/VMware Fusion.app/Contents/Library`にある`vmware-vdiskmanager`で行うことができる。まず、デフラグを行い、そのあとドライブを圧縮する。使い方は以下のようになる。

```bash
$ vmware-vdiskmanager -d /path/to/main.vmdk
...
$ vmware-vdiskmanager -k /path/to/main.vmdk
...
```

### パッケージ化

"vmwarevm"フォルダから不要なファイルを削除したら、パッケージ化する。VMwareのハード・ディスクはデフォルトでは圧縮されていないので、gzipとtar(以下に示す一つのコマンドで実行できる)で圧縮すること。

```bash
$ cd /path/to/my/vm.vmwarevm
$ tar cvzf custom.box ./*
```

## 設定

Vagrant VMWareプロバイダはVirtualBoxの代わりとはいえ、マシンのVMware特有の点をよりうまく設定できるように、いくつかの追加機能が公開されている。

### "VMWARE FUSION.APP"の位置

デフォルトでプロバイダはVMware Fusionを"/Applications"の中、次に"~/Applications"の中を探す。もし、これと異なる場所にアプリケーションを配置した場合、VMware Fusionがどこにあるかを手動でVagrantに教えてあげなければならない。

これは`VAGRANT_VMWARE_FUSION_APP`環境変数で行われる。

例えば、アプリケーションを"/Apps"ディレクトリに配置した場合、Vagrantはこのように設定されるべきである。

```bash
$ export VAGRANT_VMWARE_FUSION_APP="/Apps/VMware Fusion.app"
$ vagrant up --provider=vmware_fusion
```

### 仮想マシンクローン・ディレクトリ

デフォルトでは、VMwareのプロバイダはBox内のVMwareの仮想マシンのクローンを、Vagrantfileのあるフォルダに対する相対パスで".vagrant"フォルダに生成する。しばしば、これは都合がよいが、ある人にとって、例えばタイム・マシンのようにソフトウェアの差分バックアップを使用するような人にとっては、これはバックアップの一部としての巨大な仮想マシンをきちんと牛することができないのでとてもじれったいだろう。

プロバイダが仮想マシンをクローンしたディレクトリは、`VAGRANT_VMWARE_CLONE_DIRECTORY`環境変数を設定することでカスタマイズすることができる。これは、プロジェクトごとにユニークである必要はない。それぞれのプロジェクトが、このフォルダ内の異なるサブ・ディレクトリを使うことができる。そのため、これをシステム全体として設定するのは安全である。

### 仮想マシンのGUI

VMwareプロバイダは通常ヘッド・レス・モードで仮想マシンを起動する。デスクトップの中で仮想マシンを稼働させていたり、仮想マシンの起動時の問題の可能性をデバッグする必要があったり、UIを確認したいのであれば、VMwareプロバイダをGUIで起動するように設定することができる。

```bash
config.vm.provider "vmware_fusion" do |v|
  v.gui = true
end
```

VMWare Workstationを使用している場合は、"vmware_workstation"を使用する。

### VMXのカスタマイズ

VMXファイルから特定の鍵を追加、または削除したいならば、このようにする。

```bash
config.vm.provider "vmware_fusion" do |v|
  v.vmx["custom-key"]  = "value"
  v.vmx["another-key"] = nil
end
```

VMware Workstationを使用しているならば、"vmware_workstation"を使用する。

上記の例では、"custom-key"鍵に"value"が設定され、"another-key"鍵がVMXファイルから削除されている。

VMXのカスタマイズは、Vagrantが自身を設定する際のやり直しの可能性や設定誤りがあるかもしれないVMwareマシンが起動する前の、最後の段階として行われる。

VMXは文書化されていない、かつ、使用可能なkeyとvalueを参照できる公式なものがない。このカスタマイズ・オプションは、どのようにしたいかを明確にわかっている人ように公開されている。

よくみる共通のkeyはメモリとCPUの設定である。この療法を設定する例を以下に示す。

```bash
config.vm.provider "vmware_fusion" do |v|
  v.vmx["memsize"] = "1024"
  v.vmx["numvcpus"] = "2"
end
```

## 既知の問題

ここではVMwareプロバイダの既知の問題や制限事項などについて示す。これらのどれもが、プロバイダを使用するに際しての障害ではないが、知っておくとよいことであることに注意すること。

### Windows上のWorkstationでの転送ポートの失敗

VMware WorkstationはWindows版で、転送ポートが適切に動作しないバグを含んでいる。 Vagrantは実施にはこのバクを回避し、動作するようにしている。しかしながら、Windows上で仮想ネットワーク・エディタを実行させた場合、転送ポートは突然動作を停止する。

この場合、`vagrant reload`を実行し、再度動作させること。

この問題はVMwareに報告済みであるが、まだ対応版はリリースされていない。

## カーネルのアップグレード

VMwareでVagrant環境を稼働している場合に、カーネルのアップデートをしようとするとき、VMware Guestツールを停止したほうが良い。これは同期フォルダや、時にはネットワークなどのVagrantの機能を破壊する。

ここでは、カーネルのアップグレードの方法とGuestツールの機能の維持の仕方について記載する。カーネルのアップグレードを想定していないならば、ここは飛ばしてしまっても構わない。

### VMwareツール自動アップグレードを有効にする

一般的なOSを稼働しているならば、VMwareツールはよく自分自身を自動アップグレードできる。この設定はデフォルトでは無効となっている。以下にしめすVagrantfileで自動アップグレードを有効化している。

```bash
# Ensure that VMWare Tools recompiles kernel modules
# when we update the linux images
$fix_vmware_tools_script = <<SCRIPT
sed -i.bak 's/answer AUTO_KMODS_ENABLED_ANSWER no/answer AUTO_KMODS_ENABLED_ANSWER yes/g' /etc/vmware-tools/locations
sed -i 's/answer AUTO_KMODS_ENABLED no/answer AUTO_KMODS_ENABLED yes/g' /etc/vmware-tools/locations
SCRIPT

Vagrant.configure("2") do |config|
  # ...

  config.vm.provision "shell", inline: $fix_vmware_tools_script
end
```

これはすべてのOSに対して動作するわけではないことに注意すること。上記の設定では、`vagrant up`でカーネルのアップグレードが行われ、そして`vagrant reload`が行われる。もしHGFS(同期フォルダ)とすべてがうまく動いているように見えたら、すばらしい。そうでなければ、以下を参照すること。

### 手動によるVMwareツールの再インストール

ここでは、VMwareツールを手動でインストールしなければならないとする。これを行う方法の情報源として最も適切なものは[VMwareドキュメント](https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1018414)である。

いくつか見つけられたものを紹介する。

* カーネル・ヘッダが適切にインストールされていることを確認する。これはディストリビューションによって変わるが、通常パッケージ・マネージャを介して入手することができる。
* インストール中の出力を注意深く観察する。もし、HGFS (同期フォルダ)のサポートをビルドするのに失敗していたとしても、インストーラはVMwareツールのインストールは成功したと出力するだろう。出力をよく読み、なんらかのエラーメッセージを見つけよう。
* 

# Docker

VagrantはプロバイダとしてDockerを使用したBoxをサポートしている。これは開発環境が仮想マシンと言うよりはDockerコンテナとして動作させることができる。加えて、Dockerfileの開発のための適切なワークフローを提供する。

> **警告：Dockerの知識を前提としている。**Dockerがなんであるかを知っており、Dockerの基礎に精通していることを前提としている。もしそうでなければ、[VirtualBox](https://www.vagrantup.com/docs/virtualbox/)のような他のプロバイダで始めることを推奨する。より詳細にDocker特有の内容を知りたければ、左のナビゲーションを使用して探すこと。

## 基本的な使い方

VagrantのDockerプロバイダは、他の同じプロバイダのように振る舞う。すでにVagrantに精通しているなら、Dockerプロバイダを使うのは直感的で単純だろう。

Dockerプロバイダは`config.vm.box`設定を必須としない。Dockerコンテナに対する"base image"はDockerインデックスからPullされるか、Dockerfileからビルドされるため、Boxはそれ以上の値を追加しないし、このプロバイダに対してはオプションとなる。

### Dockerイメージ

VagrantがDockeコンテナをソースと私用することのできるひとつ目の方法は、イメージ経由である。このイメージは任意のDockerレジストリから持ってこられる。例を示す。

```bash
Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    d.image = "foo/bar"
  end
end
```

`vagrant up --provider=docker`が実行された時、これは、`foo/bar`のイメージを起動する。

これは、データベースやキューなどに依存するアプリケーションの外部のコンポーネントに有用である。一般的に、作業をしている基本的なアプリケーションではDockerfileやSSHをもつコンテナ経由である。

### Dockerfile

Vagrantは、ローカルにあるDockerfileを元に、自動的にビルドし、イメージを実行することも出来る。アプリケーションを後でイメージにビルドするときに繰り返し実施できるので有用である。

```bash
Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    d.build_dir = "."
  end
end
```

上記の設定は、Vagrantfileと同じディレクト無いに`Dockerfile`を探そうとする。`vagrant up --provider=docker`が実行された場合、Vagrantは自動的にDockerfileをビルドし、そのDockerfileに基づいたコンテナを起動する。

Dockerfielは`vagrant reload`が呼ばれるとリビルドされる。

### 同期フォルダとネットワーク

Dockerを使用するとき、Vagrantは自動的に同期フォルダとネットワークのオプションをDockerのボリュームと転送ポートに変換する。このためにDocker特有の設定を使用する必要はない。これはVagrantfileを常に見たとおりの状態であることを維持するのに役に立つ。

Dockerプロバイダは、Dockerコンテナと同期したフォルダ上の`owner`や`group`に対して指定するオプションをサポートしていない。

プライベートおよびパブリックネットワークは現状、サポートされていない。

### ホスト仮想マシン

Linuxコンテナがネイティブに実行できないシステム上、Mac OS XまたはWindowsなどでは、Vagrantは自動的に、Dockerを実行する為に"ホスト仮想マシン"を動かす。これは、稼働しているプラットフォームによる不一致なしに、DockerベースのVagrant環境の可搬性を維持できるようにする。

Vagrantは一つのホスト仮想マシンのインスタンスを起動する。そして、この一つの仮想マシン上でマルチ・コンテナを動かす。これは、Dockerプロバイダでは、一つの仮想マシンのオーバーヘッドしかなく、それが必要である場合のみである。

デフォルトでは、ホスト仮想マシンの起動は[boot2dockerに支えられている](https://github.com/mitchellh/vagrant/blob/master/plugins/providers/docker/hostmachine/Vagrantfile)、そのため素早い起動とリソースの消費が少なく済む。しかし、ホスト仮想マシンは、Vagrantfileで指定することでカスタマイズできる。これは、ホスト仮想マシンが、UbuntuやRHELなどを稼働させている仮想マシンによって、より適切なプロダクションに近づけられることを可能とする。

> **同期フォルダに関する注意：**Vagrantはできる限り"もっとも良い"同期フォルダの実装を使用することを試みる。boot2dockerに対して、これはおおむねrsyncである。この場合、ホストマシンにrsyncがインストールされていることを確認すること。そうでなければ、Vagrantは親切なエラーメッセージを表示するだろう。

ホスト仮想マシンの変更方法の例を以下に示す。これがオプションであることを覚えておくこと。指定がない場合、Vagrantはデフォルトのホスト仮想マシンを起動する。

```bash
Vagrant.configure("2") do |config|
  config.vm.provider "docker" do |d|
    d.vagrant_vagrantfile = "../path/to/Vagrantfile"
  end
end
```

プロバイダがDockerの場合、ホスト仮想マシンは最初の`vagrant up`で起動する。このホスト仮想マシンを制御する為に、グローバルな制御とともに[global-statusコマンド](https://www.vagrantup.com/docs/cli/global-status.html)を使用することができる。

## Dockerのコマンド

Dockerプロバイダは、Dockerコンテナと互いに影響を与え合うための、いくつかの有用なVagrantコマンドを公開している。これは、Dockerの下層へフル・アクセスできるので、Vagrantの上層でのワークフローを助ける。

### docker-logs

`vagrant docker-logs`は稼働しているコンテナのログを見るために使用することができる。多くのDockerコンテナは単一プロセスなので、これはその一つのプロセスのログを見るために使用する。加えて、ログはtailされた状態にすることができる。

### docker-run

`vagrant docker-run`はDockerコンテナに対して一度限りのコマンドを実行する為に使用することができる。一度限りのDockerコンテナは、オリジナルのDockerコンテナのすべてのボリューム、リンクなどの共有が開始される。以下に例を示す。

```bash
$ vagrant docker-run app -- rake db:migrate
```

上記は`app`コンテナのコンテキスト内で`rake db:migrate`を実行する。

## DockerのBox

DockerプロバイダはVagrantのBoxを必須としない。`config.vm.box`設定は完全にオプションである。

Boxはデフォルトを提供する為に使用することができ、指定することもできる。BoxにあるVagrantfileは設定読み込み処理の一部として読み込まれるので、開発環境の基礎を設定する単に使用することができる。

しかしながら、一般的に、DockerプロバイダにとってBoxは必要ではない。

## Dockerの設定

Dockerプロバイダは、設定できるいくつかのプロバイダ特有の設定オプションを持っている。完全なるリファレンスを以下に示す。

### 必須

* [`build_dir`](https://www.vagrantup.com/docs/docker/configuration.html#build_dir) (文字列) - Dockerfileを含むディレクトリへのパス。このオプションまたは`image`のいずれかが必須である。
* [`image`](https://www.vagrantup.com/docs/docker/configuration.html#image) (文字列) - イメージのIDまたは`ubuntu:12.04`などの名前で指定される、起動するイメージ。このオプションまたは`build_dir`のいずれかが必須である。

### オプショナル

グローバル設定：

* [`build_args`](https://www.vagrantup.com/docs/docker/configuration.html#build_args) (文字列の列挙) - `build_dir`が使用された時、`docker build`に渡す、他の引数。
* [`cmd`](https://www.vagrantup.com/docs/docker/configuration.html#cmd) (文字列の列挙) - コンテナ上で実行するカスタム・コマンド。例えば`["ls", "/app"]`。
* [`create_args`](https://www.vagrantup.com/docs/docker/configuration.html#create_args) (文字列の列挙) - コンテナが起動したとき、`docker_run`に渡す、追加の引数。これは、Vagrantfileによって公開されていないパラメータを設定するために使用することができる。
* [`dockerfile`](https://www.vagrantup.com/docs/docker/configuration.html#dockerfile) (文字列) - ビルド・ディレクトリ内のDockderfileの名前。これはデフォルトでは"Dockerfile"となる。
* [`env`](https://www.vagrantup.com/docs/docker/configuration.html#env) (ハッシュ値) - コンテナに公開するための環境変数。
* [`expose`](https://www.vagrantup.com/docs/docker/configuration.html#expose) (整数値の列挙) - ホスト・マシンに対してではない、コンテナから公開するポートである。リンクに対して有用である。
* [`link`](https://www.vagrantup.com/docs/docker/configuration.html#link) (メソッド、文字列の引数) - コンテナを名前によってほかのコンテナにリンクする。引数は`(name:alias)`の書式に従う。例えば、`docker.link("db:db")`のように。同じVagrantfile内で異なるコンテナにリンクする場合、`vagrant up`を`--no-parallel`フラグともに呼ぶ出す点に注意すること。
* [`force_host_vm`](https://www.vagrantup.com/docs/docker/configuration.html#force_host_vm) (ブール値) - trueの場合、Vagrantが稼働しているコンピュータがLinuxコンテナをサポートしていたとしても、ホスト仮想マシンを起動する。これはDockerを稼働する為の一貫した環境を強いるのに有用である。
* [`has_ssh`](https://www.vagrantup.com/docs/docker/configuration.html#has_ssh) (ブール値) - trueの場合、Vagrantはコンテナに対してSSHをサポートする。これは、プロビジョナなどに対して`vagrant ssh`が動くようにする。これはデフォルトでfalseである。
* [`host_vm_build_dir_options`](https://www.vagrantup.com/docs/docker/configuration.html#host_vm_build_dir_options) (ハッシュ値) - `build_dir`に対する同期フォルダのオプションである。ホスト仮想マシンが使用されている場合、ビルド・ディレクトリは同期フォルダを使用して同期をするためである。
* [`name`](https://www.vagrantup.com/docs/docker/configuration.html#name) (文字列) - コンテナの名前。ホスト仮想マシン上のすべてのコンテナに対してユニークとなる必要がある。デフォルトではVagrantは何らかのランダムな名前を生成する。
* [`pull`](https://www.vagrantup.com/docs/docker/configuration.html#pull) (ブール値) - trueの場合、`up`と`reload`されるたびにイメージをPullする。デフォルトではfalseである。
* [`ports`](https://www.vagrantup.com/docs/docker/configuration.html#ports) (文字列の列挙) - コンテナからホストに対して公開するポート。これは`host:container`の書式に従う。
* [`remains_running`](https://www.vagrantup.com/docs/docker/configuration.html#remains_running) (ブール値) - trueの場合、Vagrantはコンテナが実行を維持し、それが一定期間行われることを期待する。falseの場合、Vagrantはコンテナがある点で自動的に停止し、その際にエラーとならないことを期待する。
* [`stop_timeout`](https://www.vagrantup.com/docs/docker/configuration.html#stop_timeout) (整数値) - コンテナを停止する際に、プロセスに対してSIGTERMを送信する前に待つ時間を指定する。
* [`vagrant_machine`](https://www.vagrantup.com/docs/docker/configuration.html#vagrant_machine) (文字列) - ホストマシンとして使用するための`vagrant_vagrantfile`内のVagrantマシンの名前。これはデフォルトでは"default"である。
* [`vagrant_vagrantfile`](https://www.vagrantup.com/docs/docker/configuration.html#vagrant_vagrantfile) (文字列) - 必要な場合に、ホスト仮想マシンとして使用するための`vagrant_machine`に含まれるVagrantfileへのパス。
* [`volumes`](https://www.vagrantup.com/docs/docker/configuration.html#volumes) (文字列の列挙) - コンテナ内へのボリュームとしてマウントするためのディレクトリのリスト。これらのディレクトリはDockerが稼働しているホスト内に存在している必要がある。もし、ホストのVagrantからフォルダを同期した場合、同期フォルダだけを使用する。

以下に、認証に関する設定を示す。これらが設定された場合、コンテナを開始する前に`docker login`を行う。これによりプライベート・リポジトリからイメージをPullすることができる。

* [`email`](https://www.vagrantup.com/docs/docker/configuration.html#email) (文字列) - ログインのためのEmailアドレス。
* [`username`](https://www.vagrantup.com/docs/docker/configuration.html#username) (文字列) - ログインするためのユーザー名。
* [`password`](https://www.vagrantup.com/docs/docker/configuration.html#password) (文字列) - ログインするためのパスワード。
* [`auth_server`](https://www.vagrantup.com/docs/docker/configuration.html#auth_server) (string) - 認証のために使用するサーバ。設定してなければ、Docker Hubが使用される。

# Hyper-V

VagrantはMicrosoftによって書かれたネイティブのハイパー・バイザである[Hyper-V](https://en.wikipedia.org/wiki/Hyper-V)のためのBoxをサポートする。Hyper-V はWindows 8.1がインストールされているほとんどに対して、デフォルトで使用することができる。

Hyper-VプロバイダはWindows 8.1だけと互換性がある。Hyper-Vの以前のバージョンはVagrantが動作する為に必要なAPIを持っていない。

Hyper-Vはプロバイダを使用する前に使用可能となっていなければならない。多くのWindowsのインストールではデフォルトでHyper-Vは有効化されていない。Hyper-Vを有効化する為には、"プログラムと機能"に行き、"Windowsの機能の有効化または無効化"をクリックし、"Hyper-V"の横のチェックボックスをチェックする。

> **警告：**Hyper-Vの有効化はVirtualBox、VMwareやほかの仮想化技術を使えなくする。もし、ほかのハイパー・バイザが必要な機会があれば、Hyper-Vを有効化することなくWindowsを起動するためのブート・エントリを生成するに[このブログの投稿](http://www.hanselman.com/blog/SwitchEasilyBetweenVirtualBoxAndHyperVWithABCDEditBootEntryInWindows81.aspx)を参照すること。

## 使い方

VagrantのHyper-Vプロバイダはほかのプロバイダと同じように使用する。プロバイダに対する一般的な[基本的な使用方法](https://www.vagrantup.com/docs/providers/basic_usage.html)を読んでおくこと。

`--provider`フラグのために使用する値は`hyperv`である。

Hyper-Vは管理者権限とともにVagrantを実行することも要求している。Hyper-Vの仮想マシンの生成と管理は管理者の権利を要求するためである。Vagrantは適切な権限を持っていない場合、エラーとなるだろう。

Hyper-V用のBoxは[HashiCorpのAtlas](https://atlas.hashicorp.com/boxes/search)で簡単に見つけることができる。手始めに、`hashicorp/precise64`のBoxを試してみるとよいだろう。

## Base Boxの生成

[すべてのVagrantプロバイダ](https://www.vagrantup.com/docs/providers/basic_usage.html)と同様, VagrantのHyper-VプロバイダはBase Boxの作り方に影響を及ぼす、カスタムBoxフォーマットを持っている。

これを読む前に、[Base Boxを生成するための一般的なガイド](https://www.vagrantup.com/docs/boxes/base.html)を読んでおくこと。実際、Base Boxを生成する際に非常に頻繁に参照する事になるので、分離したタブ上でこれを開いておくのは非常に有用であろう。そのページにはBoxでインストールするソフトウェアの共通的で重要な情報が含まれている。

加えて、[Boxファイルのフォーマットの基本](https://www.vagrantup.com/docs/boxes/format.html)を理解するために助けとなるだろう。

> **上級者向け！** Vagrantを始めたばかりのユーザは理解する必要が無いので、これは当然、上級者向けの話題である。もしVagrantを始めたばかりであるならば、ここは飛ばして、手に入るBoxを使用すること。Vagrantを十分経験したユーザで、かつ、自身のカスタムBoxを生成したいならば、ここはあなたのための記事である。

### 追加的なソフトウェア


In addition to the software that should be installed based on the [Base Boxを生成するための一般的なガイド](https://www.vagrantup.com/docs/boxes/base.html)に基づいてインストールされるソフトウェアに加えて、Hyper-VベースのBoxはいくつかの追加的なソフトウェアを必須としている。

#### Hyper-Vカーネル・モジュール

Hyper-Vカーネル・モジュールをインストールする必要がある。これはパフォーマンスを向上させると同時に、VagrantがアクセスすることができるIPアドレスの報告などの必要な機能の有効化も行う。

Linuxマシン上で`lsmod`を実行し、`hv_`のプリフィックスのモジュールを探すことで、Hyper-Vカーネル・モジュールが適切にインストールされているかを検証できる。加えて、Hyper-Vマネージャの仮想マシンの"ネットワーク"タブが報告しているIPアドレスを検証する必要がある。IPアドレスが報告されていなければ、Vagrantはそれにアクセスすることができない。

多くの新しいLinuxディストリビューションでは、Hyper-VモジュールはBoxから使用することができる。

Ubuntu 12.04は、ネットワークを動作させるために、いくつかの特別な段階が必要である。これについて、その他のディストリビューションで同様の段階が必要な場合を想定し、以下に示す。この操作がなければ、Ubuntu 12.04はHyper-Vに対するIPアドレスを報告しない。

```bash
$ sudo apt-get install linux-tools-3.11.0-15-generic
$ sudo apt-get install hv-kvp-daemon-init
$ sudo cp /usr/lib/linux-tools/3.11.0-15/hv_* /usr/sbin/
```

### Boxのパッケージ化

Hyper-VのBoxのパッケージ化のために、Hyper-Vマネージャで"エクスポート"機能を使用して仮想マシンをエクスポートすることができる。これは以下に示すようなディレクトリ構造で生成される。

```bash
.
|-- Snapshots
|-- Virtual Hard drives
|-- Virtual Machines
```

"Snapshots"フォルダは削除すること。これはVagrantのHyper-Vプロバだにとって不要であり、スナップショットがフォルダに存在した場合、Boxのサイズ分増やしてしまうだけである。

[Boxファイル・フォーマットの基礎](https://www.vagrantup.com/docs/boxes/format.html)にあるように、Boxにとって"metadata.json"ファイルの生成は必須である。 メタデータに対して使用するための適切なプロバイダの値は"hyperv"である。

最後に、`tar`などのツールを使用して、これらのコンテンツ(親フォルダを除く)のアーカイブを生成する。

```bash
$ tar cvzf ~/custom.box ./*
```

誤って親フォルダをもパッケージ化してしまうのは、よくあることである。Vagrantはこの場合正しく動作しない。適切のパッケージ化されたかを検証する為に、VagrantにBoxを追加し、マシンの起動を確かめること。

### 補足

他のユーザの経験に基づく、いくつかのヘルプも使用できる。これらは公式なドキュメントではないが、問題にあたったとき、きっと良い助けとなるだろう。

* [セキュア・ブートなしのUbuntu 14.04.2(https://github.com/mitchellh/vagrant/issues/5419#issuecomment-86235427)

## 設定

VagrantのHyper-Vプロバイダは、設定可能なプロバイダ特有の設定をプションが幾つかある。完全なリスをを以下に示す。

* [`vmname`](https://www.vagrantup.com/docs/hyperv/configuration.html#vmname) (文字列) - Hyper-Vマネージャに表示させる仮想マシンの名前。デフォルトではBoxイメージのXMLから取得される。
* [`cpus`](https://www.vagrantup.com/docs/hyperv/configuration.html#cpus) (整数値) - マシンにいくつの仮想CPUを与えるか。デフォルトではBoxイメージXMLから取得される。
* [`memory`](https://www.vagrantup.com/docs/hyperv/configuration.html#memory) (整数値) - 仮想マシンが起動するときに何メガバイトのメモリを割り当てるか。、デフォルトではBoxイメージXMLから取得される。
* [`maxmemory`](https://www.vagrantup.com/docs/hyperv/configuration.html#maxmemory) (整数値) - 仮想マシンに最大何メガ培土のメモリが許されるか。このパラメータはメモリの動的割当時に切り替えられる。デフォルトではBoxイメージXMLから取得される。
* [`vlan_id`](https://www.vagrantup.com/docs/hyperv/configuration.html#vlan_id) (整数値) - ゲストのネットワーク・インタフェースに対するVLANのIDの数。デフォルトは定義されておらず、設定されていない場合、VLAN設定は何も変わらない。
* [`mac`](https://www.vagrantup.com/docs/hyperv/configuration.html#mac) (文字列) - ゲストのネットワーク・インタフェースのMACアドレス。デフォルトは定義されておらず、設定されていない場合、MACアドレスはHyper-Vによっ動的に割り当てられる。
* [`ip_address_timeout`](https://www.vagrantup.com/docs/hyperv/configuration.html#ip_address_timeout) (整数値) - 仮想マシンがOPアドレスを通知するために待機する秒数。デフォルトは120秒。仮想マシンの起動に時間がかかるバアアイ、この値を増やすべきである。
* [`differencing_disk`](https://www.vagrantup.com/docs/hyperv/configuration.html#differencing_disk) (ブール値) - 全VHDのクローンの代わりに差分ディスクを使うように切り替える。

## 制限事項

VagrantのHyper-VプロバイダはVirtualBoxやVMwareプロバイダとほとんど同じように動作するが、Hyper-Vそのものに由来するいくつかの制限事項がある。

### ネットワークの制限

VagrantはHyper-Vに対して新しいネットワークの生成や設定の方法をまだ対応していない。Hyper-Vでマシンを立ち上げた時、Vagnratは仮想マシンが接続しようとする仮想スイッチがどれかを尋ねる。

この結果、Vagrantfile内のネットワークの設定はHyper-Vに対しては完全に拒否される。Vagrantは静的IPや自動的にNATを設定するように強制することはできない。

しかしながら、マシンのIPアドレスは`vagrant up`の一部として報告され、そのIPアドレスをホスト・オンリー・ネットワークのものとして使用することができる。

### パッケージ化

VagrantはHyper-Vに対して`vagrant package`コマンドを、まだ実装していない。
これは近い将来のVagrantリリースにて追加されることだろう。

# カスタム・プロバイダ

カスタムVagrantプロバイダの作り方を学ぶためには、[カスタム・プロバイダの生成](https://www.vagrantup.com/docs/plugins/providers.html)にあるVagrantプラグイン開発ガイドを参照すること。

# 関連記事

* 前の記事：[【Vagrantドキュメント意訳】12.マルチ・マシン](http://qiita.com/ringo0321/items/1a6ebccfb2733f6e2de1)
* 次の記事：[【Vagrantドキュメント意訳】14.プラグイン](http://qiita.com/ringo0321/items/e801a0cf867da48c32e3)