惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - EricWen

IntelliJ IDEA 2024 安装与激活全攻略 Excel高手秘籍:50招助你效率翻倍 Navicat与DBeaver:数据库管理工具界的“蝙蝠侠”与“钢铁侠” 十年沉淀,重启开发之路 外网不能访问部署在虚机的NodeJs网站(80端口) Common Issues Which Cause Roles to Recycle How to remove a batch of VMs and related Disks How to create a batch of VMs with PowerShell How to build windows azure PowerShell Source Code 如何快速从一个Storage Account拷贝到另一个账号 比较Windows Azure 网站(Web Sites), 云服务(Cloud Services)and 虚机(Virtual Machines) Windows Azure 云服务角色架构 如何批量删除虚拟机及其关联的存储(Windows Azure) Use Windows Azure AD to create SSO projects 怎样提高Windows Azure Cloud Service中的WebRole的文件访问权限 Windows Azure 名词定义(Glossary) 怎样将SQL Azure数据库备份到本地或者Storage 自动备份SQL数据库到云存储Storage 数据库SQL Server DAC 导入导出数据到SQL Azure问题
PowerShell Script to Deploy Multiple VM on Azure in Parallel #azure #powershell
EricWen · 2014-02-24 · via 博客园 - EricWen

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 

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