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. SQL 笔记

    --查询某一列在哪个表里 SELECT name , object_id , type , type_desc FROM sys.objects WHERE object_id IN ( SELECT ...

  2. C#显示SQL语句格式

    --SQL SERVER生成测试环境: Create database Test; go USE [Test] GO if OBJECT_ID('Tab','U') is not null drop ...

  3. Linux系统管理命令之用户管理

    1.添加用户useradd   2.删除用户userdel userdel aming 彻底删除用户(包括删除用户目录) userdel -r aming 3.用户修改usermod    

  4. 定时器的应用---中断方式---让8个LED灯,左右各4个来回亮

    定时器的应用---中断方式---让8个LED灯,左右各4个来回亮 /*************************** 中断方式 是主程序专注于其他的事情, 待定时器中断时才执行中断子程序. ** ...

  5. linux shell 之 crontab(定时任务)详解

    1.定义: crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行.该词来源于希 ...

  6. [转][业界动态] 5G为何采纳华为力挺的Polar码?一个通信工程师的大实话

    本文转自:http://xinsheng.huawei.com/cn/index.php?app=forum&mod=Detail&act=index&id=3264791 P ...

  7. [转]Dropdownlist doesn't postback after Page_ClientValidate()

    本文转自:http://stackoverflow.com/questions/2083929/dropdownlist-doesnt-postback-after-page-clientvalida ...

  8. 【原】js实现复制到剪贴板功能,兼容所有浏览器

    两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...

  9. Servlet分页技术

    这是看韩顺平老师的servlet视频,自己动手写的,楼主看韩顺平老师的servlet是2006制作的,用的是sql server数据库,自己又用的是oracle数据库,所以怕有的同学遇到同样的问题,不 ...

  10. as3的操作符重载

    Array.prototype.valueOf = function ():Number{       var sum:Number = 0;       for each (var v:* in t ...