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. hadoop2.6分布式部署时 livenodes等于1的原因

    1.问题描述 在进行hadoop2.x版本的hdfs分布式部署时,遇到了一个奇怪的问题: 使用start-dfs.sh命令启动dfs之后,所有的datanode节点上均能看到datanode进程,然而 ...

  2. x01.os.6: 8086 指令

    M:存储器A:累加器R:寄存器SEGR:段寄存器IMM:立即数X:标志位状态依运算或操作结果而定U:相应标志位未定义-:不影响 数据传送指令 时钟数 访问次数 字节数 对标志位影响 指令意义 MOV ...

  3. php遍历循环数组实现方法

    简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...

  4. ASP.NET Core 1.0 安装并发布到Centos 7.2 使用jexus 5.8.2

    安装运行环境 sudoyuminstall libunwind libicu 下载.net core https://www.microsoft.com/net/download 下载完后上传文件 安 ...

  5. mysql 错误 1221 Incorrect usage of union and order by

    今天有个项目出现了问题 问题原因是union和order by 的问题.关于这个问题的解决方案可以猛击下面的链接. http://blog.csdn.net/gtuu0123/article/deta ...

  6. linux 文件系统解析及相关命令

    简介 文件系统就是分区或磁盘上的所有文件的逻辑集合. 文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中. 不同Lin ...

  7. Canvas事件处理

    鼠标事件 canvas.onmousedown = function(e ) {//React to the mouse down event }; canvas.addEventListener(' ...

  8. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  9. 分布式系统理论之Quorum机制

    一,Quorum机制介绍 在分布式系统中有个CAP理论,对于P(分区容忍性)而言,是实际存在 从而无法避免的.因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区.网络通信故障问 ...

  10. jquery实现输入框聚焦,键盘上下键选择城市

    在最近有个项目中 需要实现当文本框聚焦的时候,可以键盘上下键选择内容,按enter键的时候,把内容传到输入框中,如图所示: 实现代码如下: /** *输入框聚焦,键盘上下键选择城市 */ ;(func ...