Quickly build a Windows lab with VirtualBox, Packer, Vagrant and Chocolatey
July 19, 2015
I'm preparing a Powershell training for work and I needed an easy lab with virtual machines which I can easily distribute among the students. It should obviously all be Windows based.
So I started out working with Windows 10 and Vagrant to create a virtual lab, as I did on my Mac and Ubuntu box before, and I am very happy and (surprised) to announce that it works very smoothly on Windows. And I used Packer to create a Windows base box for Vagrant.
So I had great fun setting up my training lab and it would be a shame to keep it all for myself. So here goes. The Buttonfactory goes Devops!
Install Windows 10 Technical Preview and Chocolatey
Unfortunately, the preview of Windows 10 is not available anymore. If you look hard enough, I think it is possible to grab an iso somewhere.
By the way, the rest of these directions work also under Windows 7, 8 and 8.1.
After installing Windows 10 I would advise to install Chocolatey. Chocolatey is like Ninite on the command line (or like apt-get for Windows if you will) and it is going te be very important in the future.
Open a command prompt as Administrator and paste this command in your terminal:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
(Or just head over to https://chocolatey.org/ and follow the installation instructions).
Then the first thing todo is install Cmder, a perfect replacement for the Windows terminal (which sucks a bit).
Fire up the command prompt as an admin and type:
// cinst cmder -y //
The Cmder binaries are installed in c:\tools. It is added to the path so you can just fire it up (start, run) and type Cmder.
Cmder also incorporates Msysgit which brings you, apart from Git, a light set of GNU tools as well like ls, grep, awk and vim, which I adore.
Install VirtualBox, Vagrant and Packer
This is also possible from Chocolatey.
// cinst virtualbox vagrant -y //
Add vagrant to the path. My path looks like this: C:\tools\cmder;C:\PROGRA~2\Oracle\VirtualBox;c:\HashiCorp\Vagrant\bin
The next steps to install Packer are:
- Open Cmder
- Type: mkdir \Vagrant
- Type: cd \Vagrant
- Type: git clone https://github.com/joefitzgerald/packer-windows.git
- Cd into packer-windows and see what has been downloaded
- Now download packer and extract all contents to the packer-windows folder. (I think that is convenient)
Build a Windows Server 2012 R2 base box
This paragraph is based on this blog post from Rui Lopes.
We are going to edit the windows_2012_r2.json a bit to adjust it to our needs:
- On line 38: set headless to false to see what is going on
- On line 42: change the ssh_wait_timeout from 4h to 8h (to have enough time to install all updates)
- On line 76: Remove the ./scripts/compact.bat (it takes ages to run) and the ./scripts/chef.bat (we are not gonna need it) lines.
- You might want to change the answer file to change the Culture, but that can be done in the Vagrantfile later.
Now we are ready to build the box. Make sure you are in the c:\vagrant\packer-windows folder and type:
// packer build -only virtualbox-iso windows_2012_r2.json //
And now we wait. This takes forever. I'd suggest you go for a walk or perhaps to bed early. But the price is big!
Add the Windows Server 2012 R2 base box to Vagrant
When you return from your other extra curricular activity, you will see a box file is created in the c:\vagrant\packer\packer-windows folder.
You should add this box to Vagrant:
// vagrant box add --name windows_2012_r2 windows_2012_r2_virtualbox.box //
This will also take a short time.
It will add the box to C:\Users\
You can basically get rid of the box file in c:\vagrant\packer\packer-windows now, or copy it to an USB drive or so because for now it is not longer needed.
Fire up the Virtual Server already!
- Go to c:\Vagrant and create a dir for the server (mine is called DSC1)
- cd into DSC1
- Type vagrant init
- Edit the Vagrantfile that this creates and make it to look like so:
Vagrant.require_version ">= 1.6.2" $root_provision_script = <<'ROOT_PROVISION_SCRIPT' & $env:windir\system32\tzutil /s "W. Europe Standard Time" ROOT_PROVISION_SCRIPT Vagrant.configure("2") do |config| config.vm.define "DSC1" config.vm.box = "windows_2012_r2" config.vm.hostname = "DSC1" config.vm.provider :virtualbox do |v, override| v.gui = true v.customize ["modifyvm", :id, "--memory", 2048] v.customize ["modifyvm", :id, "--cpus", 2] end config.vm.network "private_network", ip: "10.10.10.4" config.vm.provision "shell", inline: $root_provision_script end
- Save it
- Type: vagrant up
When it is finished, you type vagrant rdp and you can log on to your box.
(Username vagrant, password vagrant).
Now to halt the box: you type: vagrant halt.
To destroy the box: you type vagrant destroy.
And you can start again with a clean slate in seconds with vagrant up.
Create more folders for other servers, adjust the Vagrantfile (server name, IP address) and spin them up.
Extra: add Chocolatey to the Vagrant box
You can provision your Vagrant boxes with Chocolatey, and install Cmder and Notepad2 (or whatever packages you might need from the Choco repos). To do so, change the Vagrantfile like so:
Vagrant.require_version ">= 1.6.2" $root_provision_script = <<'ROOT_PROVISION_SCRIPT' #adjust the time zone: & $env:windir\system32\tzutil /s "W. Europe Standard Time" #install Chocolatey iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) #and install Cmder and Notepad2 choco install cmder notepad2 -y ROOT_PROVISION_SCRIPT Vagrant.configure("2") do |config| config.vm.define "DSC1" config.vm.box = "windows_2012_r2" config.vm.hostname = "DSC1" config.vm.provider :virtualbox do |v, override| v.gui = true v.customize ["modifyvm", :id, "--memory", 2048] v.customize ["modifyvm", :id, "--cpus", 2] end config.vm.network "private_network", ip: "10.10.10.4" config.vm.provision "shell", inline: $root_provision_script end