I’m currently ironing out my strategy of how my Boxstarter Virtualization module will provision VM’s in Azure. I recently started a blog series of how I will provision local Hyper-V VMs here. My strategy for Azure VMs will be similar in that I will do most of the heavy lifting via Powershell remoting and fortunately lighting up a Azure VM with powershell remoting all set to go is a lot simpler that with a normal Hyper-V VM. The trick is getting the initial boxstarter modules copied to the VM. Based on some cursory googling, there are a lot of people trying to copy files to their azure VM and the most common approach is to copy/paste them via remote desktop. That does not work for me. It has to be 100% hands off.
So here is the script to accomplish this:
#Create and mount a new local VHD$volume = new-vhd -Path test.vhd -SizeBytes 50MB | ` Mount-VHD -PassThru | ` Initialize-Disk -PartitionStyle mbr -Confirm:$false -PassThru | ` New-Partition -UseMaximumSize -AssignDriveLetter -MbrType IFS | ` Format-Volume -NewFileSystemLabel "VHD" -Confirm:$false #Copy my files Copy-Item C:\dev\boxstarter "$($volume.DriveLetter):\" -RecurseDismount-VHD test.vhd #upload the Vhd to azureAdd-AzureVhd -Destination http://mystorageacct.blob.core.windows.net/vhdstore/test.vhd ` -LocalFilePath test.vhd #mount the VHD to my VMGet-AzureVM MyCloudService MyVMName | ` Add-AzureDataDisk -ImportFrom ` -MediaLocation "http://mystorageacct.blob.core.windows.net/vhdstore/test.vhd" ` -DiskLabel "boxstarter" -LUN 0 | ` Update-AzureVM
This uses the Powershell v3 Hyper-V module to create the VHD locally. Then it uses the Azure Powershell module (available for download here) to upload that vhd and mount it to my VM.
Here is a screenshot of my remote Powershell session connected to my azure VM.
Maybe there is a better way. I’d love to hear it if you know of one, but this works well without having to expose a public SMB endpoint.
With this in place I can invoke Boxstarter on the VM and initiate a provisioning session that installs and configures all of my things. My virtualization module will allow individuals to provision a VM with a command like this:
New-BoxstarterAzureVM VMName -BoxstarterPackage mypackage ` -InstanceSize "ExtraSmall" -OS "Windows-Server-2012-Datacenter" ` -credential Admin -location "West US"