Terraform Получает Индекс Списка На For_Each

  • Автор темы LeGeNdA_C*
  • Обновлено
  • 21, Oct 2024
  • #1

Терраформ новичок здесь. Я хотел бы перебрать список, используя

 "Name" = "Company010.1.0.0/16" 
, but it seems like the key and value are the same:

"Name" = "Company010.0.0.0/16"

Я бы хотел, чтобы имя тега было "Name" = "Company02" and "Name" = "Company01" но в соответствии с терраформом применимо,

Я получаю: provider "aws" { profile = "default" region = "us-east-1" } variable "vpc_cidrs" { default = ["10.0.0.0/16", "10.1.0.0/16"] } resource "aws_vpc" "vpc" { for_each = toset(var.vpc_cidrs) cidr_block = each.value enable_dns_hostnames = true tags = { Name = "Company0${each.key}" } } and for_each

Что мне не хватает?

#терраформировать

LeGeNdA_C*


Рег
25 Apr, 2014

Тем
75

Постов
224

Баллов
639
  • 25, Oct 2024
  • #2

Terraform предлагает два механизма повторения ресурсов:

 
 
 
 
 resource "aws_vpc" "vpc" {

for_each = { for i, b in var.vpc_cidrs : i => b }

cidr_block           = each.value

tags = {

Name = format("Companyd", each.key + 1)

}
}
 
и tags = { Name = "Company0${index(var.vpc_cidrs, each.value) + 1}" } . Основное различие между ними заключается в том, как Terraform будет отслеживать созданные ими несколько экземпляров:

  • При использовании resource "aws_vpc" "vpc" { count = length(var.vpc_cidrs) cidr_block = var.vpc_cidrs[count.index] tags = { Name = format("Companyd", count.index + 1) } } , each of the multiple instances is tracked by a number starting at 0, giving addresses like count и cidr_block .
  • При использовании resource "aws_vpc" "vpc" { for_each = { for i, b in var.vpc_cidrs : b => { index = i } } cidr_block = each.key tags = { Name = format("Companyd", each.value.index + 1) } } , each of the multiple instances is tracked by a string which could be obtained either from a key in a map or from an element in a set, giving addresses like for_each и # aws_vpc.vpc["10.0.0.0/16"] will be updated in-place ~ resource "aws_vpc" "vpc" { ~ tags = { ~ Name = "Company01" -> "Company02" } # ... } # aws_vpc.vpc["10.0.0.0/16"] will be updated in-place ~ resource "aws_vpc" "vpc" { ~ tags = { ~ Name = "Company02" -> "Company01" } # ... } .

Самая распространенная причина выбора for_each rather than for_each заключается в том, чтобы гарантировать, что порядок любого набора значений, вызывающего повторение, не имеет значения. В вашем конкретном случае это даст тот же результат независимо от того, ["10.1.0.0/16", "10.0.0.0/16"] is ["10.0.0.0/16", "10.1.0.0/16"] или var.vpc_cidrs , because the instances would be tracked by the CIDR block string and the index in the list is totally ignored.

С учетом всего сказанного, причина, по которой индекс недоступен напрямую при использовании count is that this would defeat the main purpose of using for_each : это снова сделает заказ значимым. В вашей конкретной ситуации, если вы использовали индекс в имени тега, то изменение порядка списка приведет к тому, что Terraform запланирует поменять теги на этих двух VPC:

aws_vpc.vpc["10.1.0.0/16"]

Возможно, это нормально для вашего случая, если эти числа нужны только для создания некоторой уникальности, и не имеет значения, будут ли они переназначаться с течением времени по мере добавления, удаления и переупорядочения блоков CIDR во входной переменной. Если это правда, то мы можем получить значение, содержащее исходный индекс, и использовать его как часть aws_vpc.vpc["10.0.0.0/16"] like this:

for_each

Однако если вы считаете, что позиция в списке действительно важна — например, если вы хотите поменять местами два элемента в списке, чтобы изменить aws_vpc.vpc[1] values on the two existing objects rather than to re-tag them, it would be more appropriate to use aws_vpc.vpc[0] чтобы Terraform сам отслеживал их по индексам:

count ||answer||

Нашел простое решение с помощью индекс функция:

for_each ||answer||

Вы можете использовать без индекса:

count

каждый.ключ = порядковый номер

 

Марина150996


Рег
17 Apr, 2011

Тем
66

Постов
174

Баллов
544
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно