If you've already configured your local machine's PowerShell environment to interact with your Azure subscription (see here: http://www.windowsazure.com/en-us/documentation/articles/install-configure-powershell/), then you can begin saving yourself an awful lot of button-clicking by scripting out the start/stop of your VMs, especially if you have a cluster of Azure VMs for testing and demonstrating SQL Server Availability Groups, as an example.
You will need to change a few things in these scripts to suit your purposes:
- Change "YourAzureAccount@hotmail.com" to your Azure account. For MSDN-based Azure subscriptions like mine, this address was my Hotmail email address.
- Change "Visual Studio Premium with MSDN" to the name of your Azure Subscription. This was the name my MSDN-based account was given by default.
- Populate the $vms variable with a list of Azure VM's in the cluster you're looking to start/stop as a group, replacing "yourVMName-alwayson-dom" and so forth.
Big thanks and credit for the assist on this blog post to Cody Gros, SharePoint Solutions Architect and my coworker at Sparkhound.
Stop a list of Azure Accounts:
#if expired, Add-AzureAccount
Get-AzureSubscription | ? {$_.ActiveDirectoryUserId -eq 'YourAzureAccount@hotmail.com' -and $_.SubscriptionName -match "Visual Studio Premium with MSDN" } | Set-AzureSubscription -SubscriptionId $_.SubscriptionID
$vmHash =@{}
$vms = "yourVMName-alwayson-dom","yourVMName-alwaysonsql1","yourVMName-alwaysonsql2","yourVMName-alwaysonWSFC"
Get-AzureVM | foreach{$vmHash.Add($_.Name,$_.ServiceName)}
foreach ($vm in $vms) {
$currentVMService = $vmHash[$vm]
Write-Host "Current VM:$($vm)"
$thisvm = Get-AzureVM -ServiceName $currentVMService -Name $vm
Write-Host "Stopping VM:$($thisvm.Name)"
Stop-AzureVM -Name $thisvm.Name -ServiceName $thisvm.ServiceName #-StayProvisioned
}
Note about the -StayProvisioned tag above. Specifying this option will retain some IP settings, but will cause your VM's to continue to accrue Azure credit, even while stopped. Use with care.
Start a list of Azure Accounts:
#if expired, Add-AzureAccount
Get-AzureSubscription | ?{$_.ActiveDirectoryUserId -eq 'YourAzureAccount@hotmail.com' -and $_.SubscriptionName -match "Visual Studio Premium with MSDN" } | Set-AzureSubscription -SubscriptionId $_.SubscriptionID
$vmHash =@{}
$vms = "yourVMName-alwayson-dom","yourVMName-alwaysonsql1","yourVMName-alwaysonsql2","yourVMName-alwaysonWSFC"
Get-AzureVM | foreach{$vmHash.Add($_.Name,$_.ServiceName)}
foreach ($vm in $vms) {
$currentVMService = $vmHash[$vm]
Write-Host "Current VM:$($vm)"
$thisvm = Get-AzureVM -ServiceName $currentVMService -Name $vm
Write-Host "Starting VM:$($thisvm.Name)"
Start-AzureVM -Name $thisvm.Name -ServiceName $thisvm.ServiceName
}
If upon running the scripts you receive either of these errors:
get-azuresubscription : The term 'get-azuresubscription' is not recognized as the name of a cmdlet,
Get-AzureVM : The term 'Get-AzureVM' is not recognized as the name of a cmdlet, function, script file, or
Then you don't have the PowerShell module loaded, and PowerShell isn't automatically loading it for you. Use the Import-Module command. Below is the default location of the module.
#if expired, use Add-AzureAccount
Import-Module 'C:\Program Files (x86)\Microsoft SDKs\Windows Azure\PowerShell\Azure\Azure.psd1'