Портал на Azure - Присвояване на тагове към групи ресурси с помощта на Powershell и четене на данни от електронна таблица на Excel или CSV

Търся да приложа нов набор от тагове към редица групи ресурси на Azure. Етикетите трябва да се придържат към конвенция за именуване, която е конкатенация на редица стойности на полета с данни в колони на Microsoft Excel и ще се четат ред по ред за всяка група ресурси.

Например, нека използваме по-долу като пример за първите 6 колони:

Колона A: Име на абонамент за Azure Колона B: Име на група ресурси Колона C: Бизнес единица Колона D: Разходен център Колона E: Код на проекта Колона F: Име на услуга или приложение

въведете описание на изображението тук

Тогава предложеният етикет ще бъде конкатенация на например:

[Колона A] - [Колона B] - [Колона C] - [Колона E] - [Колона F]

Следователно резултатният таг за първия ред трябва да изглежда като примера по-долу:

Абонамент 1: RG-01: BU-A1: 1001: WebApp-1

Powershell вероятно би бил предпочитаното решение за изпълнение на тази задача и бих приветствал всякакви предложения или идеи как да постигна това.


person hitman126    schedule 29.03.2021    source източник
comment
можете ли да обясните повече за вашия пример? имате 6 колони, тогава таговете за група ресурси трябва да използват A+B+C+xx като стойност за 1 таг, или има 6 тагове като A,B,C?   -  person Ivan Yang    schedule 01.04.2021
comment
@IvanYang, току-що актуализирах оригиналния въпрос с илюстрация, която, надявам се, трябва да изясни нещата по-добре.   -  person hitman126    schedule 02.04.2021


Отговори (1)


Актуализиран отговор 0406:

Скриптовете по-долу могат да работят при сценарий с няколко реда:

Забележка: за използване на Set-AzContext cmdlet, моля, инсталирайте Az.Accounts 2.2. 7 модул.

#load the .csv file
$file_path = "D:\test\t1.csv"

#define the tag name, you can change it as per your need
$tag_name="mytag111"


#loop the values in the .csv file
Import-Csv -Path $file_path | ForEach-Object{

#define a tag value with empty string
$tag_value=""

#define a variable for subscription name
$subscription_name = ""

#define a variable for resource group name
$resource_group_name = ""

foreach($property in $_.PSObject.Properties)
{

 #here, get the subscription name from the csv file
 if($property.name -eq "Az Sub Name"){
        $subscription_name = $property.Value
   }
 #here, get the resource group name from the csv file
 if($property.name -eq "RG Name"){
        $resource_group_name = $property.Value
   }

  #exclude the "Cost Ctr" column
  if(!($property.name -eq "Cost Ctr"))
  {
    #then we loop all the values from each row, and then concatenate them
    #here, we just don't want to add the colon(:) at the end of the value from "Svc/App" column
    if(!($property.name -eq "Svc/App"))
    {  
    $tag_value += $property.Value + " : "
    }
    else
    {
    $tag_value += $property.Value
    }
  } 
 
}

#change the context as per different subscription
Set-AzContext -Subscription $subscription_name

#get the existing tags for the resource group
$tags = (Get-AzResourceGroup -Name $resource_group_name).Tags
#add the new tags to the existing tags, so the existing tags will not be removed
$tags +=@{$tag_name=$tag_value}
#set the tags
Set-AzResourceGroup -Name $resource_group_name -Tag $tags

}

"completed********"

Ето данните от теста:

въведете описание на изображението тук

Скриптовете работят добре според моето тестване. И моля, уведомете ме, ако имате проблеми с това.


Оригинален отговор:

Моля, поправете ме, ако съм ви разбрал погрешно.

Пиша прост код за четене на данни от .csv файл и след това добавям тагове към групата ресурси.

Имайте предвид, че при моето тестване има само 1 ред данни в .csv файл и твърдо свържете името на групата ресурси, моля, не се колебайте да промените кода, за да отговаря на вашите изисквания.

И да използвате Set-AzResourceGroup cmdlet, трябва да се уверите, че Az.Resources модулът е инсталиран.

Файлът .csv:

въведете описание на изображението тук

Кодът на powershell:

#load the .csv file
$file_path = "D:\test\t1.csv"

#define the tag name, you can change it as per your need
$tag_name="mytag111"
#define a tag value with empty string
$tag_value=""

#loop the values in the .csv file
Import-Csv -Path $file_path | ForEach-Object{

foreach($property in $_.PSObject.Properties)
{
  #exclude the "Cost Ctr" column
  if(!($property.name -eq "Cost Ctr"))
  {
    #then we loop all the values from each row, and then concatenate them
    #here, we just don't want to add the colon(:) at the end of the value from "Svc/App" column
    if(!($property.name -eq "Svc/App"))
    {
    $tag_value += $property.Value + " : "
    }
    else
    {
    $tag_value += $property.Value
    }
  } 
 
}

#get the existing tags for the resource group
$tags = (Get-AzResourceGroup -Name yyrg11).Tags
#add the new tags to the existing tags, so the existing tags will not be removed
$tags +=@{$tag_name=$tag_value}
#set the tags
Set-AzResourceGroup -Name yyrg11 -Tag $tags

}

"completed********"

Резултатът от теста:

въведете описание на изображението тук

В портала на Azure се добавя етикетът:

въведете описание на изображението тук

person Ivan Yang    schedule 02.04.2021
comment
това изглежда абсолютно брилянтно!! Със сигурност ще го пробвам и след това ще дам някаква обратна връзка. И само за пояснение, вярвам, че сте посочили, че всички съществуващи тагове ще бъдат запазени, така ли е? Вашият чудесен принос е високо оценен и скоро ще дам обратна връзка. - person hitman126; 02.04.2021
comment
Пробвах вашия скрипт и мисля, че може да е дефектен. Вместо да имате само един ред като файл с входни данни, моля, копирайте моите примерни данни, като стартирате скрипта си срещу множество редове, както представих в първоначалната си заявка, която имаше 4 реда. В противен случай предложеното от вас решение не възпроизвежда напълно тестовия случай. - person hitman126; 04.04.2021
comment
@hitman126 първо, да, всички съществуващи тагове ще бъдат запазени. Второ, мисля, че е лесно да модифицирам кода за няколко реда, така че само за целите на тестването написах много прост скрипт. Не се притеснявайте, ще актуализирам кода по-късно за няколко реда. - person Ivan Yang; 06.04.2021
comment
@ hitman126 Актуализирах отговора си, включително сценарий с много редове. Моля, опитайте и ме уведомете, ако имате проблеми със скриптовете :). - person Ivan Yang; 06.04.2021
comment
Здравей @Ivan Yang, със сигурност ще го направя. Надявам се да изпробвам актуализирания скрипт много скоро и ще дам обратна връзка. Оценявам го. - person hitman126; 08.04.2021
comment
@hitman126 здравей пробвал ли си го? моля, уведомете ме за актуализациите :) - person Ivan Yang; 12.04.2021
comment
Тествах скрипта и се радвам да потвърдя, че работи перфектно, като се изискваше само да инициализирам променливата $subscription_name. Оценявам го. Имам обаче една малка промяна, която да поискам. В рамките на блока за условие Ако сте изключили колоната Cost Ctr. Моят действителен сценарий изисква повече колони да бъдат изключени. Затова бихте ли любезно актуализирали скрипта, за да изключите например 3 колони (можете да изберете произволни имена за другите две колони). Като алтернатива можете ли просто да прецизирате скрипта, за да се изпълнява само върху 5-те колони с етикети, без условие за изключване? - person hitman126; 14.04.2021
comment
Здравей @Ivan Yang, да, разбира се, определено ще го отбележа като отговор. Искрени извинения. Исках да го направя по-рано. Все още ли изисквате от мен да изпратя отделен въпрос за исканото подобрение? Аз лично бих предпочел да е част от този въпрос, тъй като е пряко свързан. - person hitman126; 14.04.2021
comment
@hitman126 би било добре да повдигнеш нов въпрос :). Просто ми кажете URL адреса. - person Ivan Yang; 15.04.2021