[Vagrant][Windows] WindowsでVagrantを使用してVM環境を作成する

# 目的

Windows 環境で Vagrant を使用して Ubuntu の VM 環境を作成する。

# 検証環境
今回の検証環境は以下になります。
Vagrant と VirtualBox のバージョンの組み合わせによっては Vagrant の実行時にエラーが発生するため注意してください。

| パッケージ名| バージョン          |
|------------|--------------------|
| Host OS    | Windows 7  64bit   |
| Vagrant    | 1.9.5              |
| VirtualBox | 5.1.22 r115126     |

# Vagrant のインストール
公式からインストーラーをダウンロードして、インストールします。

[Download - Vagrant by HashiCorp](https://www.vagrantup.com/downloads.html)

# VirtualBox のインストール
Vagrantのプロバイダとして、今回はVirtualBoxを使用します。([VMwareも対応](https://www.vagrantup.com/vmware/index.html)していますが、有料版になります)
公式からインストーラーをダウンロードして、インストールします。

[Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)

# VMイメージを作成
## 公式の配布ベースイメージの検索
HashiCorp が Vagrant Box のホスティングをしている Atlas から必要なパッケージを探します。
(以前は Vagrant Cloud という名前だったようです)

[Discover Vagrant Boxes | Atlas by HashiCorp](https://atlas.hashicorp.com/boxes/search)

今回はubuntuの公式boxを使用します。

[ubuntu | Atlas by HashiCorp](https://vagrantcloud.com/ubuntu)

※ちなみに「Vagrantbox.es」というbaseイメージを配布しているサイトもありますが、こちらのboxは出自も中身も不明なものが多いため基本的には使用しないほうが安全かとは思います。

## Vagrantfileの作成
`vagrant init` にて `Vagrantfile` を作成します。

```bash:Vagrantfileの作成
# Vagrantfileの作成
$ vagrant init ubuntu/xenial64
```

## VMの初回起動
次に `vagrant up` コマンドにて仮想マシン(VM)の起動を行います。

実行するVM が未作成の場合は作成を行います。
その際に、ベースボックスがローカルにない場合はダウンロードを行います。

```bash:プロキシ環境下の場合環境変数を設定する
# windows command promptの場合
$ set http_proxy="http://<proxy addr>:<port>/"
$ set https_proxy="http://<proxy addr>:<port>/"

## Git Bashの場合
$ export http_proxy="http://<proxy addr>:<port>/"
$ export https_proxy="http://<proxy addr>:<port>/"
```
```bash:ベースボックスから仮想マシンの作成とプロビジョニング
$ vagrant up
or
$ vagrant up --provider virtualbox
```
virtualbox指定はデフォルト動作のため省略できます。

## VMへの接続
作成が完了したらssh接続します。

```bash:作成したvmへssh接続
# ssh接続
$ vagrant ssh
```

```shell-session:接続後の環境確認例
ubuntu@ubuntu-xenial:~$ uname -a
Linux ubuntu-xenial 4.4.0-75-generic #96-Ubuntu SMP Thu Apr 20 09:56:33 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

ubuntu@ubuntu-xenial:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
```

これで Vagrantを使用してUbuntuの環境が作成できました。

その後のUbuntuの初期設定に関しては以下の記事が詳しいです。Vagrantでのプロビジョニングも含みます。
[Ubuntu14.04のVM作ったらとりあえずやること - Qiita](http://qiita.com/hidekuro/items/9927de60a64e8012e359)

# その他

VagrantBox, VirtualBoxの保存先を(Cドライブ以外などに)変更したい場合は環境変数 `VAGRANT_HOME` を変更して下さい。こちらに関しては以下の記事が詳しいです。 
[Vagrant, VirtualBox 大きいファイルの保存先を変更する - Qiita](http://qiita.com/hidekuro/items/15c6acacea69d0182f31)

その他のVagrantの操作に関しては公式のドキュメントを参照して下さい。
[Getting Started - Vagrant by HashiCorp](https://www.vagrantup.com/docs/getting-started/)

# 注意点

プロバイダをVirtualBoxで指定した場合、VirtualBoxのスタートページにもVMが追加されています。
ただし、スタートページから起動した場合 `/vagrant` がマウントされないなど動作が異なるため、特に制約がない限りは初回起動時以降も `vagrant up` コマンドにて起動することをおすすめします。

# プラグイン
## プロキシ設定の自動化
[tmatilai/vagrant-proxyconf: Vagrant plugin that configures the virtual machine to use proxies](https://github.com/tmatilai/vagrant-proxyconf)

こちらのプラグインの利用は便利ですが2016年3月で更新がとまっているため、使用時には注意したほうが良いかもしれないです
少々面倒ですが最終的にはChef, Ansibleなどのプロビジョナー側でプロキシ設定の解決を行った方が良いかと思います。

# 関連
## ネットワーク設定
+ [vagrantのネットワークについて - Qiita](http://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11)
+ [[Vagrant][Linux] ネットワークのデフォルトゲートウェイの設定 - Qiita](http://qiita.com/koara-local/items/d1e2092d5c5fc6d1739f)

## ベースボックス関連
[vagrant box updateでboxファイルをアップグレードする](https://hnakamur.github.io/blog/2015/04/25/vagrant-box-update/)

## その他
+ [[Vagrant][Windows][VirtualBox] Vagrantで作成したVMのディスクサイズを拡張する - Qiita](http://qiita.com/koara-local/items/ec30097c19e0f55a7787#_reference-ce4a03bba53c4b869859)
+ [[Vagrant] vagrant up 時に常に実行される provison を設定する - Qiita](http://qiita.com/koara-local/items/28f108fb475b364def13)
+ [[Vagrant][Ubuntu] Atlasで提供されているUbuntu boxのパスワード設定を確認 - Qiita](http://qiita.com/koara-local/items/068a7c293d58a4b50d12)
+ [VirtualBoxとVagrantの紐付けをやり直す方法 - Qiita](http://qiita.com/kayo_h/items/a6fe507b87170c90fe89)

# 不具合対処
## rsync: change_dir "/path/to/dir" failed: No such file or directory (2)
1.8.0 ~ 少なくともVagrant 2.0.0まで発生
[Windows + vagrant 1.8.5 + rsync 3.1.1 で発生する、config.vm.synced_folderの失敗の直し方 - Qiita](https://qiita.com/ndxbn/items/0c4f3b382ce9de2893cb)

# 参考
[VagrantとDockerについて名前しか知らなかったので試した - Qiita](http://qiita.com/hidekuro/items/fc12344d36d996198e96)
[Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する - Qiita](http://qiita.com/ozawan/items/160728f7c6b10c73b97e)
[VagrantfileでVirtualBoxのVMパフォーマンス向上設定 - Qiita](http://qiita.com/hidekuro/items/385bcc4b9eb43945751d)
[Vagrant + VirtualBox で CPU コアを2つ以上割り当てると遅い - Qiita](http://qiita.com/d_nishiyama85/items/c50c95795865ae7f714b)