Using the Azure CLI, we can use the az vm list
command to get a list of all VMs in the current subscription. Adding on this, we just loop over all our subscriptions and add the results to a single list
$results=New-Object -TypeName System.Collections.ArrayList;$subs = az account list | ConvertFrom-Json;$subIndex = 0;foreach ($sub in $subs){ $subIndex++; Write-Progress "Gathering VMs" -Status $sub.name -PercentComplete ($subIndex / $subs.Count * 100) $vms = az vm list --subscription $sub.id | ConvertFrom-Json $results.Add(@{ subscription = $sub vms = $vms }) > $null; $results | ConvertTo-Json -Depth 100 > vms.json;}
This, however, does not include the power on/off state of the vms
We can get all the VM info + the power state using the az graph query
command. This has the benefit of being even faster. A little work is needed to process the paginated results, but it's still fairly easy.
$query = "Resources| where type == 'microsoft.compute/virtualmachines'| extend PowerState = tostring(properties.extended.instanceView.powerState.code)| extend vmSize = tostring(properties.hardwareProfile.vmSize)";$params = @("--graph-query", $query -replace "`n", """--output", "json");$total=New-Object -TypeName System.Collections.ArrayList;$count=0;while ($true){ $results = az graph query @params | ConvertFrom-Json; foreach ($d in $results.data) { $total.Add($d); } $count += $results.count; $params = @("--graph-query", $query -replace "`n", """--output", "json""--skip-token", $results.skip_token"--skip", $count ); if ([string]::IsNullOrEmpty($results.skip_token)) {break;}}$total | ConvertTo-Json -Depth 100 > vms_fast.json;
Note that we use array splatting instead of object splatting