使い捨てできるWindows環境(必要ソフト導入済み)の作り方

# はじめに

「Vagrant up」だけで必要ソフトが準備された状態のWindows環境を作るのが目標。
とりあえず動くようになったので、自分用のメモとして記録。
※別環境でも試したので情報を追記。(2014/09/29)

## 試した環境

ホスト : Windows 8.1 Pro
ゲスト : Windows 7 Pro
Vagrant : 1.5.1
VirtualBox : 4.3.12

# 手順

1. VagrantとVirtualBoxをインストール

2. vagrant-windowsプラグインをインストール(Vagrant1.6では不要)

    コマンドプロンプトで下記を実行

    ```
    vagrant plugin install vagrant-windows
    ```

3. 仮想マシン(Windows)の作成

    VirtualBox上の名前を「Win7Pro_64bit」に設定して、仮想マシンをインストール。
    仮想マシンの設定はWeb上の他の記事を参考に。

    ※設定を忘れないように下記にメモ。(**下記は仮想マシン上で行う**)
    * 管理者のユーザー名とパスワードは共に`Vagrant`
    * WindowsUpdateの自動実行をOFF
    * リモートデスクトップを有効に
    * `VBoxWindowsAdditions`を実行
    * 下記をコマンドプロンプトで実行(Vagrant1.6向け~~では不要か？~~でも必要)[(参考ページ)](https://github.com/WinRb/vagrant-windows)

        ```
        winrm quickconfig -q
        winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
        winrm set winrm/config @{MaxTimeoutms="1800000"}
        winrm set winrm/config/service @{AllowUnencrypted="true"}
        winrm set winrm/config/service/auth @{Basic="true"}
        sc config WinRM start= auto
        ```

4. 仮想マシン上にchocolateyをインストール(**下記は仮想マシン上で行う**)
    
    1. PowerShellの実行ポリシーを変更

        ```
        Set-ExecutionPolicy RemoteSigned
        ```

    2. PowerShellでChocolateyをインストール

        ```
        iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
        ```

5. 仮想マシンの電源をOFF

6. Boxの作成

    1. デフォルト値を記述したVagrantfileを作成。
        * 参考ページ
            * http://www.vagrantup.com/blog/feature-preview-vagrant-1-6-windows.html
            * https://github.com/WinRb/vagrant-windows
            * http://qiita.com/toruuetani/items/d86408113b18344e62c4

    2. Vagrantfileと同じ階層で下記コマンドを実行。package.boxができる。

        ```
        vagrant package --base "Win7Pro_64bit" --vagrantfile Vagrantfile
        ```

7. Boxを追加

    ```
    vagrant box add Win7Pro_64bit package.box
    ```

8. Vagrantfileを任意の作成

    任意の場所にフォルダを作成して下記内容のファイルを配置。

    ```:Vagrantfile
    VAGRANTFILE_API_VERSION = "2"

    Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
        config.vm.guest = :windows
        config.vm.box = "Win7Pro_64bit"
        config.vm.provider :virtualbox do |vb|
            vb.gui = false
        end

        config.vm.provision "shell", path: "./setup.bat"
    end
    ```

9. プロビジョン用のバッチファイルを作成

    下記内容のファイルをVagrantfileと同じ場所に配置。

    ```bat:setup.bat
    cinst c:\vagrant\packages.config
    ```

10. ゲストOSへインストールするソフトをファイルに記述

    インストール対象を記述したファイルをVagrantfileと同じ場所に配置。

    ```xml:packages.config
    <?xml version="1.0" encoding="utf-8"?>
    <packages>
        <package id="MicrosoftSecurityEssentials" />
        <package id="GoogleChrome" />
    </packages>
    ```

11. Vagrantで仮想マシンを起動
    
    Vagrantfileと同じ場所で下記コマンドを入力

    ```
    vagrant up
    ```

12. リモートデスクトップで`localhost:13389`に接続。

# メモ

* ホスト上のVagrantfile配置フォルダは、ゲスト上のC:\Vagrantと同期(?)してる。
* プロビジョニング用のバッチから実行するChocolateyで、なぜか停止する場合がある模様。
    * 確認できたのはFreeMindのインストール。
    * パッケージによってはダイアログの「はい」ボタンを押さないとインストールが先に進まない。(これが原因か？)
    * 止まってしまったら`Ctrl+C`で強制終了したら先に進んだ。
    * 手順9でcinstを呼び出すように記述しないで、手順12のあとに手動実行した方が無難かも。

# まとめ

vagrantでwindowsの仮想マシンを作って、プロビジョニングでChocolateyを実行してるだけ。
Chocolateyのインストールもプロビジョニングで行うのが今後の課題。
ChefとかPowerShell DSCも試してみたいところ。