How to create a batch of VMs with PowerShell
Foreword
When we do some test that need several VMs, we can use PowerShell script or CmdLets to implement what we want.
Keywords
PowerShell, New-AzureVMConfig, New-AzureProvisioningConfig, New-AzureVM, Get-AzureVM, Add-AzureDataDisk, Update-AzureVM
Summary
Detailed
# Name of subscription
$SubscriptionName = "CIETest01"
# Name of storage account (where VMs will be deployed)
$StorageAccount = "portalvhdstpb7xn5sd8cck"
$VmNames=New-Object System.Collections.ArrayList
$VmNames.Add("erictest001")
$VmNames.Add("erictest002")
function Provision-VM( [string]$VmName ) {
Start-Job -ArgumentList $VmName {
param($VmName)
$Location = "China North"
$InstanceSize = "Small" # You can use any other instance, such as Large, A6, and so on
$AdminUsername = "ericwen" # Write the name of the administrator account in the new VM
$Password = "Passw0rd" # Write the password of the administrator account in the new VM
$Image = "0c5c79005aae478e8883bf950a861ce0__Windows-Server-2012-Essentials-20131018-enus" #Copy the ImageName property you get from Get-AzureVMImage
# You can list your own images using the following command:
# Get-AzureVMImage | Where-Object {$_.PublisherName -eq "User" }
New-AzureVMConfig -Name $VmName -ImageName $Image -InstanceSize $InstanceSize |
Add-AzureProvisioningConfig -Windows -Password $Password -AdminUsername $AdminUsername|
New-AzureVM -Location $Location -ServiceName "$VmName" -Verbose
}
}
# Set the proper storage - you might remove this line if you have only one storage in the subscription
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccount $StorageAccount
# Select the subscription - this line is fundamental if you have access to multiple subscription
# You might remove this line if you have only one subscription
Select-AzureSubscription -SubscriptionName $SubscriptionName
# Every line in the following list provisions one VM using the name specified in the argument
# You can change the number of lines - use a unique name for every VM - don't reuse names
# already used in other VMs already deployed
foreach($VmName in $VmNames)
{
Provision-VM $VmName
}
# Wait for all to complete
While (Get-Job -State "Running") {
Get-Job -State "Completed" | Receive-Job
Start-Sleep 1
}
# Display output from all jobs
Get-Job | Receive-Job
# Cleanup of jobs
Remove-Job *
# Displays batch completed
echo "Provisioning VM Completed"
echo "Attach new data disk to VM"
foreach($VmName in $VmNames){
Get-AzureVM -ServiceName $VmName -Name $VmName -Verbose | Add-AzureDataDisk -CreateNew -DiskSizeInGB 10 -DiskLabel "main" -LUN 1 -Verbose | Update-AzureVM -Verbose
}
Conclusion
Reference