S. Space
S. Space

Reputation: 315

Azure Powershell - Script to obtain VM info across subscriptions

Trying to run a script that will connect to each subscription, and pull the

$azureSubs = Get-AzureRMSubscription
$azureSubs | ForEach-Object {Select-AzureRMSubscription $_ | Out-Null; Get-AzureRMVM | select resourcegroupname, name, licensetype -WarningAction SilentlyContinue}

This works, BUT I'd like to add two more pieces of information: the "OSType" and "VMSize"

If I do a GET-AZURERMVM, in the table for that subscription that the command is run in, the two pieces of information I need are there: VmSize and OsType

However, when I try to add them to the query, the columns are blank. I believe the VmSize is in the HardwareProfile, and OsType is in the OsProfile, as if I run a "Get-AzureRMVM -name (name) -resourcegroupname (RGname)", then it shows "Hardware Profile: VMSize" and "OSProfile: ComputerName, AdminUsername windowsConfiguration, Secrets"

Ultimate goal is to get the script that will, for each subscription, print results like:

ResourceGroupName  |  Name | License Type | VMSize | OS Type
TEST_RG | Test_VM | Windows_Server | DS3_v2 | Windows
Test_RG | Test_VM2 |     |  DS3_v2 | Linux

etc.

Thankful for any help; sorry for such a noob question. Have spent so much time trying to figure this out...

Upvotes: 1

Views: 1655

Answers (2)

Sage Pourpre
Sage Pourpre

Reputation: 10333

Something like the following would work. What you were missing mainly was calculated properties. This is what allow you to perform a select of custom property.

Some notes:

In your code, you used -WarningAction SilentlyContinue on the Select statement. You need to put it on the Get-AzureRMVM CmdLet instead.

This is my opinion but unless you are writing one-liners on purposes, try aerating your code more. It will make it way easier to read, debug and maintain.

This is the code you wrote, modified to include the calculated properties and with the WarningAction parameter set to Get-AzureRMVM instead of the Select statement.

$azureSubs = Get-AzureRMSubscription
$Vms = $azureSubs | ForEach-Object {Select-AzureRMSubscription $_ | Out-Null; Get-AzureRMVM -WarningAction SilentlyContinue | select resourcegroupname, name, licensetype,  @{Name="VMSize";Expression={$_.HardwareProfile.VmSize}},@{Name="OsType";Expression={$_.StorageProfile.OsDisk.OsType}}}
$Vms | ft 

The same thing, with some progress indication without forcing everything on one line.

$azureSubs = Get-AzureRMSubscription
$Vms = New-Object 'System.Collections.Generic.List[PSObject]'
ForEach ($sub in $azureSubs) {
    Select-AzureRMSubscription $sub | Out-Null  
    Write-Host "Processing Subscription $($sub.Name)".PadRight(50,' ') -ForegroundColor Cyan -NoNewline
    [PsObject[]]$items = Get-AzureRMVM -WarningAction SilentlyContinue | 
        select resourcegroupname,
           name, 
           licensetype,
            @{Name="VMSize";Expression={$_.HardwareProfile.VmSize}}, 
            @{Name="OsType";Expression={$_.StorageProfile.OsDisk.OsType}}

        Write-Host "($($items.count) retrieved)"
        if ($items -ne $null) {
            $vms.AddRange($items)
        }
}


$vms | Format-Table 

Upvotes: 1

Hannel
Hannel

Reputation: 1706

You are looking for something like this on the select side

select resourcegroupname, name, licensetype, @{Name="VMSize";Expression={$_.HardwareProfile.VmSize}}, @{Name="OsType";Expression={$_.StorageProfile.OsDisk.OsType}}

Upvotes: 0

Related Questions