Портал 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, установите 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, а затем добавляю теги в группу ресурсов.

Обратите внимание, что в моем тестировании в CSV-файле содержится только одна строка данных, и имя группы ресурсов жестко привязано. Пожалуйста, не стесняйтесь изменять код в соответствии со своими требованиями.

И использовать Set-AzResourceGroup, убедитесь, что 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********"

Результат теста:

введите описание изображения здесь

На лазурном портале добавляется тег:

введите описание изображения здесь

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. Очень признателен. Однако я хочу попросить об одном незначительном изменении. В блоке условия If вы исключили столбец 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