Экспорт Azure групп ресурсов с тегами в CSV - PullRequest
3 голосов
/ 30 мая 2020

Я новичок в Powershell, и я пытаюсь создать скрипт, который получает все данные из Azure группы ресурсов (включая теги) и экспортирует результат в CSV.

На данный момент насколько я знаю, есть несколько способов сделать это: AzureCLI, AzureRM (Powershell) и Az (Powershell).

Пример 1. Этот «однострочный сценарий» выполняет работу, но для этого требуется для ввода фактических тегов вместо автоматического получения их из Azure

$resourceGroupList = Get-AzResourceGroup | select-Object -Property ResourceGroupName,Location,ResourceId,ProvisioningState,@{N='Enviroment (Tag)'; E={$_.Tags.Enviroment}} ,@{N='Ownership (Tag)'; E={$_.Tags.Ownership}} 
$resourceGroupList | export-csv test.csv -NoTypeInformation

csv output

Другой способ, который я нашел, - использовать AzureCLI

$resourceGroupList = az group list --query "[].{ResourceGroupName:name,Location:location,ResourceType:type,provisioningState:properties,Tags:tags,ResourceGroupID:id}" -o json | convertfrom-json
$resourceGroupList | Export-Csv test.csv -NoTypeInformation

This is the output:

Я действительно борюсь с массивами и тем, как их форматировать для экспорта в CSV, как в формате из примера 1.

Любая помощь / идеи были бы чрезвычайно признательны!

Спасибо!

1 Ответ

3 голосов
/ 30 мая 2020

Здесь главное понять, как работать с хэш-таблицами, ведь именно это и содержится в свойстве Tags. Еще нам нужно учитывать, что теги не согласованы, как бы мы ни старались, как администраторы, это приведет к несогласованным свойствам в нашем массиве объектов PSObject, если мы просто добавим свойства для тегов из каждой отдельной группы ресурсов. Поэтому перед тем, как начать сортировку данных для CSV-файла, нам нужен уникальный список тегов для всех групп. Группам ресурсов, у которых нет этого тега, потребуется свойство, чтобы у нас был полный набор данных для результирующего файла CSV. В любом случае, меньше разговоров, больше кода.

# Initialise output array
$Output = @()

# Collect all the groups from the current subscription
$ResourceGroups = Get-AzResourceGroup

# Obtain a unique list of tags for these groups collectively
$UniqueTags = $ResourceGroups.Tags.GetEnumerator().Keys | Select-Object -Unique

# Loop through the resource groups
foreach ($ResourceGroup in $ResourceGroups) {
    # Create a new ordered hashtable and add the normal properties first.
    $RGHashtable = [ordered] @{}
    $RGHashtable.Add("Name",$ResourceGroup.ResourceGroupName)
    $RGHashtable.Add("Location",$ResourceGroup.Location)
    $RGHashtable.Add("Id",$ResourceGroup.ResourceId)
    $RGHashtable.Add("ProvisioningState",$ResourceGroup.ProvisioningState)

    # Loop through possible tags adding the property if there is one, adding it with a hyphen as it's value if it doesn't.
    if ($ResourceGroup.Tags.Count -ne 0) {
        $UniqueTags | Foreach-Object {
            if ($ResourceGroup.Tags[$_]) {
                $RGHashtable.Add("$_ (Tag)",$ResourceGroup.Tags[$_])
            }
            else {
                $RGHashtable.Add("$_ (Tag)","-")
            }
        }
    }
    else {
        $UniqueTags | Foreach-Object { $RGHashtable.Add("$_ (Tag)","-") }
    }

    # Update the output array, adding the ordered hashtable we have created for the ResourceGroup details.
    $Output += New-Object psobject -Property $RGHashtable
}

# Sent the final output to CSV
$Output | Export-Csv -Path test.csv -NoClobber -NoTypeInformation -Encoding UTF8 -Force

Я провел тест с некоторыми базовыми c данными в аналогичной структуре, потому что сейчас я не на своей рабочей машине.

$eur = "" | select ResourceGroupName,Location,Tags,ResourceId,ProvisioningState
$asia = "" | select ResourceGroupName,Location,Tags,ResourceId,ProvisioningState
$na = "" | select ResourceGroupName,Location,Tags,ResourceId,ProvisioningState
$sa = "" | select ResourceGroupName,Location,Tags,ResourceId,ProvisioningState

$eur.ResourceGroupName = "ParisDC"
$eur.Location = "westeurope"
$eur.ResourceId = 1
$eur.ProvisioningState = "Succeeded"
$tags = @{
    Computer = "FRDC01"
    IP = "10.11.10.10"
    Datacenter = "West Europe"
    CostCode = 54321
}
$eur.Tags = $tags

$asia.ResourceGroupName = "TokyoDC"
$asia.Location = "eastasia"
$asia.ResourceId = 2
$asia.ProvisioningState = "Succeeded"
$tags = @{
    Server = "TODC01"
    IP = "10.12.10.10"
    CostCode = 98765
}
$asia.Tags = $tags

$na.ResourceGroupName = "NewYorkDC"
$na.Location = "eastus"
$na.ResourceId = 3
$na.ProvisioningState = "Failed"
$tags = @{
    Computer = "USDC01"
    IP = "10.10.10.10"
    Owner = "John Smith"
    CostCode = 12345
}
$na.Tags = $tags

$sa.ResourceGroupName = "RioDC"
$sa.Location = "brazilsouth"
$sa.ResourceId = 4
$sa.ProvisioningState = "Succeeded"
$tags = @{}
$sa.Tags = $tags

$ResourceGroups += $sa,$na,$eur,$asia

Если вы хотите увидеть образец, просто скопируйте и вставьте данные, а затем опустите строку $ResourceGroups = Get-AzResourceGroup в предоставленном мной коде.

Результат:

Name      Location    Id ProvisioningState IP (Tag)    Computer (Tag) Owner (Tag) CostCode (Tag) Datacenter (Tag) Server (Tag)
----      --------    -- ----------------- --------    -------------- ----------- -------------- ---------------- ------------
RioDC     brazilsouth  4 Succeeded         -           -              -           -              -                -
NewYorkDC eastus       3 Failed            10.10.10.10 USDC01         John Smith  12345          -                -
ParisDC   westeurope   1 Succeeded         10.11.10.10 FRDC01         -           54321          West Europe      -
TokyoDC   eastasia     2 Succeeded         10.12.10.10 -              -           98765          -                TODC01
...