简体   繁体   中英

Azure PowerShell - get VM usage from across all subscriptions

I want to list all the VMs that generate costs in a specific timeframe or billing period.

I managed to create this script to get me the desired output:

$file="C:\temp\GeneratedCost-short.csv"

(az consumption usage list `
--start-date "2020-07-01" --end-date "2020-07-31" | ConvertFrom-Json)`
| Where-Object {$_.product -Match "Virtual Machines"}`
| Sort-Object -Property instanceName -Descending | Select-Object instanceName, subscriptionName`
| Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation | Set-Content $file

But this will give me the output only for the current subscription.

How can I run on all the subscriptions that I have on the azure tenant?

I tried using the below version but it doesn't seem to work:

$file="C:\temp\GeneratedCost-short.csv"

$VMs = @()
$Subscriptions = Get-AzSubscription
foreach ($sub in $Subscriptions) {
    Get-AzSubscription -SubscriptionName $sub.Name | az account set -s $sub.Name
    $VMs += (az consumption usage list --start-date "2020-07-01" --end-date "2020-07-03" | ConvertFrom-Json)
}
# 
$VMs | Where-Object {$_.product -Match "Virtual Machines"}`
| Sort-Object -Property instanceName -Descending | Select-Object instanceName, subscriptionName`
| Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation | Set-Content $file

Any suggestions?

Mixing the Azure PowerShell module and Azure CLI could be causing issues with your code if the accounts haven't been retrieved between the two. Verify that az cli has the proper subscriptions

az account list -o table

If you don't see the accounts be sure to re-run az login .

Here's your code with the azure cli only

$file="C:\temp\GeneratedCost-short.csv"

$VMs = @()
az account list -o json | ConvertFrom-Json |
    ForEach-Object {
        Write-Host "Getting usage for account: " $_.Name
az account set -s $_.Name
    $VMs += (az consumption usage list --start-date "2020-07-01" --end-date "2020-07-03" | ConvertFrom-Json)
    }

$VMs | Where-Object {$_.product -Match "Virtual Machines"} |
    Sort-Object -Property instanceName -Descending |
        Select-Object instanceName, subscriptionName |
            Get-Unique -AsString | ConvertTo-Csv -NoTypeInformation |
                Set-Content $file

never do += on an array, worst pattern ever.

[System.Collections.Generic.List[PSObject]]$VMs = @()
$subs = Get-AzSubscription # | Where-Object {$_.State -eq 'Enabled'}
foreach ($s in $subs) {
  Set-AzContext -SubscriptionObject $s | Out-Null
  $vm = # your search here ...
  $VMs.Add($vm)
 }
  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM