Windows ServerのVagrant box構築を自動化する(VirtualBox編)

##概要
Windows ServerのVagrant box構築を自動化する(今回は2012R2と2008R2)。boxを構築しておけば必要な時にVM作って消してやり直してが高速で出来るので大変便利である。
自動化されるのは以下の部分である。

 - 評価版ISOイメージのダウンロード
 - 仮想マシン(VM)の構築と起動
 - OSインストール
 - 更新(Windows Update)
 - VirtualBox Guest Additionsのインストール
 - 各種設定(リモートデスクトップなど)
 - sysprep(セキュリティID消去など)
 - boxの構築

つまり、Windows Updateが全て終わった最新の状態を作成できる。
今回は[packer-template](https://github.com/mwrock/packer-templates)を使う。詳しい説明は[こちら](http://www.hurryupandwait.io/blog/creating-windows-base-images-for-virtualbox-and-hyper-v-using-packer-boxstarter-and-vagrant)。

##経緯
2008R2での検証が必要になりvagrantで効率化しようと考えたのだが、ネット上からwindowsのboxを適当に拾ってくるわけにもいかず、自前で構築する事に(だって何か怖いじゃん。プロプライエタリだよ？)。Windowsのbox構築を自動化する用のpackerテンプレートはいくつかあるのだが、[packer-template](https://github.com/mwrock/packer-templates)は2008R2に対応しておらず、[boxcutter](https://github.com/boxcutter/windows)は手元の環境でうまく動かない。packer-templateが2012R2で動くことは確認できたので、今回はpacker-templateを元にboxcutterの2008R2用の設定を移植することとした。

####注意点
この手順は非常に時間がかかる(Windows Updateや仮想HDDのシュリンク等を含むため)。手元の環境では2012R2が8時間かかった。2008R2は更にかかった(よく覚えてないくらい)。

#検証
以下の環境にて動作を確認した

- ホストOS
  - OS:Windows 10 Home
  - CPU:Core-i5 2450M (2.5GHz)
  - Memory:4GB
  - SSD:128GB

- ゲストOS
  - Windows Server 2012 R2 (評価版)
  - Windows Server 2008 R2 (評価版)

なおゲストOSはどちらも英語版である。
とりあえず特定のOSに依存する部分は無いような気がしている。もしMacOSやLinux上で動いたら教えて欲しい。

##必要ソフト
今回は必要ソフトの詳しい説明は省く。既に良い記事が幾らでもQiitaにある。
####[Vagrant](https://www.vagrantup.com/)
仮想環境のフロントエンドツール。VMの構築や削除をコマンド一つで行える。作って壊してを繰り返す時に大変便利。
####[VirtualBox](https://www.virtualbox.org/)
Oracle社の仮想環境。わりとどこでも動く。
####[Packer](https://www.packer.io/)
boxの作成を自動化するツール。vagrantと作者が同じ。
####[packer-template](https://github.com/Yoto/packer-templates)
packerでの自動化に必要なテンプレート。2012R2用のものしかなかったので今回はforkして2008R2用を追加した。親リポジトリは[こちら](https://github.com/mwrock/packer-templates)。

##構築手順
###必要ソフトをインストール
インストールはWindowsなら[Chocolatey](https://chocolatey.org/)、MacOSなら[Homebrew](http://brew.sh/)経由が簡単である。今回はChocolateyを使ったやり方を述べる。まず[インストーラー](https://chocolatey.org/install.ps1)をダウンロードして管理者権限で実行する。その後下記コマンドでVagrant, VirtualBox, Pakcerをインストール出来る。

```powershell:
>./install.ps1
>choco install vagrant virtualbox packer -y
```
管理者権限で実行すること。powershellを右クリックして[管理者として実行する]でOK

packer-templateは`git clone`かzipでダウンロードするかして、どこでもよいので適当なフォルダに配置する。以降の作業はこのフォルダで行うので、容量の大きいパーティション上を推奨(例えば構築中の仮想マシンの仮想HDDファイルはこのディレクトリ以下に配置される)。

###評価版ISOイメージの取得(Optional)
デフォルトではpackerが自動でダウンロードするので前もってダウンロードしておく必要はない。もし既にダウンロード済みであれば以下の修正でISOイメージからVMを構築できる。ちなみにダウンロードはこちらから。[2008R2](https://www.microsoft.com/en-us/download/details.aspx?id=11093) [2012R2](https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2012-r2)
2008R2の場合は./vbox-2008r2.jsonを、2012R2の場合は./vbox-2012r2.jsonの下記の部分を変更する。(2008R2のイメージをダウンロードして./isoフォルダに置いた場合の設定。ISOイメージ名は環境による(と思う)。)

```json:./vbox-2008r2.json
- "iso_url": "http://care.dlservice.microsoft.com/dl/download/6/2/A/62A76ABB-9990-4EFC-A4FE-C7D698DAEB96/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO"?

+ "iso_url": "./iso/7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso"
```

(行頭-が削除行、+が追加行である)

###boxの構築
カレントディレクトリにて下記コマンドを実行。**非常に時間がかかるので注意**。

2012R2を使う場合
`>packer build -force -only virtualbox-iso ./vbox-2012r2.json`

2008R2を使う場合
`>packer build -force -only virtualbox-iso ./vbox-2008r2.json`



##使用手順
box listに出来たboxを追加する
`>vagrant box add ?`

仮想マシンを配置するフォルダで下記コマンドを実行
`>vagrant init`

あとはいつも通りup,halt,destroy出来る。
起動：`>vagrant up`
停止：`>vagrant halt`
破壊：`>vagrant destroy`
もちろん破壊後`>vagrant up`すれば最初の状態に戻る。お疲れ様でした。boxの更新についてはQiitaを(ry

##正規版DVDからの構築
正規版DVDのISOイメージを用いた作成も可能とは思うが未検証である。手順は以下。
正規版DVDからISOイメージを作成し、適当なフォルダに格納する。
チェックサムを計算する。Windowsであれば[ここ](https://www.microsoft.com/en-us/download/confirmation.aspx?id=11533)からツールをダウンロードできる。
ISOイメージの場所とチェックサム値を用いて./vbox-2012r2.jsonファイルのチェックサムとパスを修正する。(2008R2の場合は./vbox-2008r2.jsonを修正)

```json:./vbox-2012r2.json
- "iso_checksum": "beed231a34e90e1dd9a04b3afabec31d62ce3889",
- "iso_url": "./iso/7601.17514.101119-1850_x64fre_server_eval_en-us-GRMSXEVAL_EN_DVD.iso"?

+ "iso_checksum": "<計算したチェックサム値>",
+ "iso_url": "<取得したISOイメージへのパス>"
```

あとはbox構築のコマンドを発行すればよい。

##今後の課題など
- 日本語対応
- Hyper-V上での動作
- PullRequestするかどうか
- なんか文章が読みにくい

PullRequestってどういう時にしてもいいんでしょうね？適当？