Since I need to deploy, start, stop and remove many virtual machines created from a common image I created (you know, Tabular is not part of the standard images provided by Microsoft…), I wanted to minimize the time required to execute every operation from my Windows Azure PowerShell console (but I suggest you using Windows PowerShell ISE), so I also wanted to fire the commands as soon as possible in parallel, without losing the result in the console.

In order to execute multiple commands in parallel, I used the Start-Job cmdlet, and using Get-Job and Receive-Job I wait for job completion and display the messages generated during background command execution. This technique allows me to reduce execution time when I have to deploy, start, stop or remove virtual machines. Please note that a few operations on Azure acquire an exclusive lock and cannot be really executed in parallel, but only one part of their execution time is subject to this lock. Thus, you obtain a better response time also in these scenarios (this is the case of the provisioning of a new VM).

Finally, when you remove the VMs you still have the disk containing the virtual machine to remove. This cannot be done just after the VM removal, because you have to wait that the removal operation is completed on Azure. So I wrote a script that you have to run a few minutes after VMs removal and delete disks (and VHD) no longer related to a VM. I just check that the disk were associated to the original image name used to provision the VMs (so I don’t remove other disks deployed by other batches that I might want to preserve).

These examples are specific for my scenario, if you need more complex configurations you have to change and adapt the code. But if your need is to create multiple instances of the same VM running in a workgroup, these scripts should be good enough.

I prepared the following PowerShell scripts:

  • ProvisionVMs: Provision many VMs in parallel starting from the same image. It creates one service for each VM.
  • RemoveVMs: Remove all the VMs in parallel – it also remove the service created for the VM
  • StartVMs: Starts all the VMs in parallel
  • StopVMs: Stops all the VMs in parallel
  • RemoveOrphanDisks: Remove all the disks no longer used by any VMs. Run this script a few minutes after RemoveVMs script.
 

ProvisionVMs
# Name of subscription 
 
$SubscriptionName = "Copy the SubscriptionName property you get from Get-AzureSubscription"
 
$VmNames=New-Object System.Collections.ArrayList 
     $VmNames.Add("erictest001")
     $VmNames.Add("erictest002")
 
# Name of storage account (where VMs will be deployed)
 
$StorageAccount = "Copy the Label property you get from Get-AzureStorageAccount"
 
function Provision-VM( [string]$VmName ) {
 
Start-Job -ArgumentList $VmName {
 
param($VmName)
 
$Location = "Copy the Location property you get from Get-AzureStorageAccount"
 
$InstanceSize = "A5" # You can use any other instance, such as Large, A6, and so on
 
$AdminUsername = "UserName" # Write the name of the administrator account in the new VM
 
$Password = "Password" # Write the password of the administrator account in the new VM
 
$Image = "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"
 
RemoveVMs
# Name of subscription 
 
$SubscriptionName = "Copy the SubscriptionName property you get from Get-AzureSubscription"
 
function Remove-VM( [string]$VmName ) {
 
Start-Job -ArgumentList $VmName {
 
param($VmName)
 
Remove-AzureService -ServiceName $VmName -Force -Verbose
 
}
 
}
 
# 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 remove 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)
     {
       Remove-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
 
Remove-Job *
 
# Displays batch completed
 
echo "Remove VM Completed"
 
StartVMs
# Name of subscription 
 
$SubscriptionName = "Copy the SubscriptionName property you get from Get-AzureSubscription"
 
function Start-VM( [string]$VmName ) {
 
Start-Job -ArgumentList $VmName {
 
param($VmName)
 
Start-AzureVM -Name $VmName -ServiceName $VmName -Verbose
 
}
 
}
 
# 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 starts 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)
     {
       Start-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
 
Remove-Job *
 
# Displays batch completed
 
echo "Start VM Completed" 
 
StopVMs
# Name of subscription 
 
$SubscriptionName = "Copy the SubscriptionName property you get from Get-AzureSubscription"
 
function Stop-VM( [string]$VmName ) {
 
Start-Job -ArgumentList $VmName {
 
param($VmName)
 
Stop-AzureVM -Name $VmName -ServiceName $VmName -Verbose -Force
 
}
 
}
 
# 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 stops 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)
     {
       Stop-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
 
Remove-Job *
 
# Displays batch completed
 
echo "Stop VM Completed"
 
RemoveOrphanDisks
$Image = "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" }
 
# Remove all orphan disks coming from the image specified in $ImageName
 
Get-AzureDisk |
 
Where-Object {$_.attachedto -eq $null -and $_.SourceImageName -eq $ImageName} |
 
Remove-AzureDisk -DeleteVHD -Verbose 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

Refference:http://sqlblog.com/blogs/marco_russo/archive/2013/10/29/powershell-script-to-deploy-multiple-vm-on-azure-in-parallel-azure-powershell.aspx

PowerShell Script to Deploy Multiple VM on Azure in Parallel #azure #powershell的更多相关文章

  1. SharePoint 2013 How to Backup Site Collection Automatically With a PowerShell Script

    In this post I will introduce a way how to run a script for backing up SharePoint data which could b ...

  2. 【Azure 应用服务】Azure Function App 执行PowerShell指令[Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt]错误

    问题描述 使用PowerShell脚本执行获取Azure订阅列表的指令(Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt).在本地 ...

  3. [New Portal]Windows Azure Virtual Machine (21) 将本地Hyper-V的VM上传至Windows Azure Virtual Machine

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,并且保留OS中的内容. 注意:笔者没有执行Syspr ...

  4. Azure 基础:使用 powershell 创建虚拟机

    在进行与 azure 相关的自动化过程中,创建虚拟主机是避不开的操作.由于系统本身的复杂性,很难用一两条简单的命令完成虚拟主机的创建.所以专门写一篇文章来记录使用 PowerShell 在 azure ...

  5. 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...

  6. Azure资源管理工具Azure PowerShell介绍

    什么是 Azure PowerShell? Azure PowerShell 是一组模块,提供用于通过 Windows PowerShell 管理 Azure 的 cmdlet.你可以使用 cmdle ...

  7. 【Azure 应用服务】使用PowerShell脚本上传文件至App Service目录  

    问题描述 使用PowerShell脚本上传文件至App Service目录的示例 脚本示例 对文件进行上传,使用的 WebClient.UploadFile 方法进行上传.当文件夹中包含子目录,执行以 ...

  8. 【Azure 环境】用 PowerShell 调用 AAD Token, 以及调用Azure REST API(如资源组列表)

    问题描述 PowerShell 脚本调用Azure REST API, 但是所有的API都需要进行权限验证.要在请求的Header部分带上Authorization参数,并用来对List Resour ...

  9. Send email alert from Performance Monitor using PowerShell script (检测windows服务器的cpu 硬盘 服务等性能,发email的方法) -摘自网络

    I have created an alert in Performance Monitor (Windows Server 2008 R2) that should be triggered whe ...

随机推荐

  1. getaddrinfo function

    The getaddrinfo function provides protocol-independent translation from an ANSI host name to an addr ...

  2. XP系统下IIS常见的几个问题

    随笔说明: 个人笔记.仅供参考 根据日常遇到的相关问题不定期增改 时间:2015年1月7日23:09 Soft:Microsoft .NET Framework 4(独立安装程序) Microsoft ...

  3. C# RGB和HSB相互转换

    背景 最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色.也就是说取该颜色同色系的深浅两种颜色.首先想到的是调节透明度,但效果不理想.后来尝试调节颜色亮度,发现这才是正解 ...

  4. java报表工具FineReport使用中遇到的常见报错及解决办法(三)

    这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己. 出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有.有报错要看日志.下面简单罗列下常见的问题,大多 ...

  5. for循环的省略

    for (初始化语句; 条件语句; 控制语句){ 被执行的代码块 }; 例如: for (var i=0;i<cars.length;i++) { document.write(cars[i] ...

  6. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  7. USB Type-C 接口有什么优点?

    USB Type-C 接口有什么优点? 提到USB Type-C接口(以下简称为USB-C),大家第一个能想到的是USB-C接口能正反插,用起来很舒服.了解更多的可能还支持USB-C接口速度更快, 达 ...

  8. [No000065]python 获取当前时间

    要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年到现在时间相隔的时间.用下面的方式来取得当前时间的时间戳: import time print(time.time()) 输出的结果是 ...

  9. OC中的指针

    NSError *err = nil; NSError __strong **error = &err; //因为在oc中,通过* *err 创建的指针是用__strong修改的,所以要一致, ...

  10. css实现省略号

    样式: {width: 160px; overflow: hidden; text-overflow:ellipsis; white-space: nowrap;} 说明: white-space: ...