The IaaS capabilities of Azure could be very handy when you need to create temporary development/test environments during the SDLC. Automating the creation and clean-up of these environments could save a lot of time and compute time ($$).
Azure exposes an interface based on PowerShell to automate all the steps required to do this, and I spent some time researching how to properly do it. You will find many references and blog post on how to create VMs using the PowerShell API in Azure; however I did not find many updated, accurate references of how to do it for an entire environment. Probably because the API has evolved so quickly and these articles are no longer relevant.. The results are summarized in the following script which demonstrates the creation of a standard deployment of an enterprise multi-tier environment (web front-end, application server and database server).
$ErrorActionPreference = "Stop" # stop on any error
function GetLatestImage($family){
$images = Get-AzureVMImage `
| where { $_.ImageFamily -eq $family } `
| Sort-Object -Descending -Property PublishedDate
$latestImage = $images[0]
return $latestImage
}
# Environment variables are defined here:
# ONLY LOWERCASE LETTERS HERE!!
$EnvironmentName = "azrtest"
# Create Storage Account through the Portal (vmstorageazrtest)
$StorageAccount = "vmstorage$EnvironmentName"
Write-Host $StorageAccount
$AzurePubSettingsFile = "C:\MyStuff\MyDrop\Dropbox\Personal\Windows Azure MSDN - Visual Studio Ultimate-12-19-2013-credentials.publishsettings"
$VMSize = "Small"
$Location = "Southeast Asia"
$AdminUserName = "admin2K"
$AdminPwd = "password2K"
$OSFamily = "Windows Server 2008 R2 SP1"
$server_A_Name = "WFEServer"
$server_B_Name = "DBServer"
$server_C_Name = "AppServer"
# This must be unique
$CloudServiceName = "vmstorageazrtest"
# Run GetLatestImage.ps1
$Image = GetLatestImage($OSFamily)
$ImageName = $Image.ImageName
# Create Storage Account through the Portal
# IF NO StorageAccount exists, ONE IS CREATED HERE!
#New-AzureStorageAccount -StorageAccountName $StorageAccount -Location $Location -Label "azrtest"
# Remove-AzureStorageAccount -StorageAccountName $StorageAccount
# Config subscription
import-azurepublishsettingsfile $AzurePubSettingsFile
#Get-AzureStorageAccount | Select Label
Set-AzureSubscription -SubscriptionName "Windows Azure MSDN - Visual Studio Ultimate" -CurrentStorageAccount $StorageAccount
# Create Azure Service
New-AzureService -ServiceName $CloudServiceName -Location $Location
# Create Machine (1) - Windows
# You can create a new virtual machine in an existing Windows Azure cloud service, or you can create a new cloud service by using the Location parameter.
New-AzureQuickVM -Windows -ServiceName $CloudServiceName -Name $server_A_Name -ImageName $ImageName -Password $AdminPwd -AdminUsername $AdminUserName -Verbose
New-AzureQuickVM -Windows -ServiceName $CloudServiceName -Name $server_B_Name -ImageName $ImageName -Password $AdminPwd -AdminUsername $AdminUserName -Verbose
New-AzureQuickVM -Windows -ServiceName $CloudServiceName -Name $server_C_Name -ImageName $ImageName -Password $AdminPwd -AdminUsername $AdminUserName -Verbose
This sample script will create 3 VMs running “Windows Server 2008 R2 SP1″: WFE, App Server and DB Server. All VMs will be “grouped” in the same Azure Cloud Service: $CloudServiceName.
If you plan to use it, make sure you edit the environment variables in the top of the script:
- The Environment Name: $EnvironmentName
- The storage account used to store the VHDs: $StorageAccount
- Location of the Azure Publishing settings file: $AzurePubSettingsFile
- Size of the VMs: $VMSize
- Location – use get-azurelocation for a list of locations: : $Location
- Admin Username and Password – this is the local account you will use to remote into them: $AdminUserName and $AdminPwd
- OS: $OSFamily
To shut down and clean-up the VMs created, you could use the following script:
#CleanUp
# Environment variables are defined here:
# ONLY LOWERCASE LETTERS HERE!!
$EnvironmentName = "azrtest"
# Create Storage Account through the Portal (vmstorageazrtest)
$StorageAccount = "vmstorage$EnvironmentName"
Write-Host $StorageAccount
$AzurePubSettingsFile = "C:\MyStuff\MyDrop\Dropbox\Personal\Windows Azure MSDN - Visual Studio Ultimate-12-19-2013-credentials.publishsettings"
$VMSize = "Small"
$Location = "Southeast Asia"
$AdminUserName = "admin2K"
$AdminPwd = "password2K"
$OSFamily = "Windows Server 2008 R2 SP1"
$server_A_Name = "WFEServer"
$server_B_Name = "DBServer"
# They must be unique
$CloudServiceName = "vmstorageazrtest"
$server_A_ImageName = $ImageName
$server_B_ImageName = $ImageName
# Config subscription
import-azurepublishsettingsfile $AzurePubSettingsFile
#Get-AzureStorageAccount | Select Label
Set-AzureSubscription -SubscriptionName "Windows Azure MSDN - Visual Studio Ultimate" -CurrentStorageAccount $StorageAccount
# Stop & Remove VMs
$vm = Get-AzureVM -ServiceName $CloudServiceName -Name $server_A_Name
if($vm){
Stop-AzureVM -ServiceName $CloudServiceName -Name $server_A_Name
Remove-AzureVM -ServiceName $CloudServiceName -Name $server_A_Name
}
$vm = Get-AzureVM -ServiceName $CloudServiceName -Name $server_B_Name
if($vm){
Stop-AzureVM -ServiceName $CloudServiceName -Name $server_B_Name
Remove-AzureVM -ServiceName $CloudServiceName -Name $server_B_Name
}
# Remove any existing Azure Cloud Service
$azureService = Get-AzureService -ServiceName $CloudServiceName
if($azureService){
Write-Host "Cloud service: $CloudServiceName found!, deleting it.."
Remove-AzureService -ServiceName $CloudServiceName -Force
}
#Remove Storage Account
# Remove container first
Remove-AzureStorageContainer -Name vhds -Force
Remove-AzureStorageAccount -StorageAccountName $StorageAccount
Some aspects were not fully covered in this version of the script:
· Networking: VMs will be able to talk between each other, but we currently do not have any control on the addressing assigned to them.
· AD: VMs are created as standalone servers, not part of an AD domain.
I hope you can find this helpful and time saving.
Image may be NSFW.
Clik here to view.

Clik here to view.
