Для чего нужна функция итератора в for_each от Terraform? - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь понять функцию iterator for_each в Terraform 0.12. документы говорят:

Итератор:

Аргумент iterator (необязательно) задает имя временной переменной, которая представляеттекущий элемент комплексного значения.Если опущено, имя переменной по умолчанию соответствует метке динамического блока ...

Но я не могу найти примеры кода, которые используют эту функцию, и я не могу разобратьсядля чего это.Я прочитал Terraform 0.12 preview , но он там не упоминается, и я обнаружил некоторые проблемы с GitHub (например, this one), но там тоже не могу найти подсказки.

Это только для улучшения читабельности?Я был бы очень признателен за пример кода и объяснение, выходящее за рамки того, что я могу найти в документации.

1 Ответ

2 голосов
/ 04 июня 2019

В основном на разных языках, таких как Python, Ruby, C ++, Javascript, Groovy и т. Д., Вы можете установить временную переменную в лямбде (особенно если она итеративна), которая хранит временное значение для каждой итерации в лямбда-выражении.В некоторых языках (например, Groovy) для этой переменной есть имя по умолчанию, или вы можете установить его самостоятельно (т. Е. Имя переменной по умолчанию в Groovy - it).Например, в Groovy у нас есть:

strings.each() {
  print it
}

напечатает содержимое присваивания переменной string (при условии, что оно может быть преобразовано в String).Следующий код имеет точно такую ​​же функциональность:

strings.each() { a_string ->
  print a_string
}

, где мы явно назвали временную переменную как a_string.Это аналогично аргументу iterator в вашем вопросе.Итак, в Terraform мы видим пример в документации :

resource "aws_security_group" "example" {
  name = "example" # can use expressions here

  dynamic "ingress" {
    for_each = var.service_ports
    content {
      from_port = ingress.value
      to_port   = ingress.value
      protocol  = "tcp"
    }
  }
}

Согласно документации:

Если опущено, имя переменной по умолчаниюна метку динамического блока

и имя выше ingress (обратите внимание, что это метка, указанная рядом с блоком dynamic).Конечно же, мы видим имя временной переменной выше ingress, и к ней обращаются через ingress.value.Чтобы использовать функциональность iterator для переименования этой временной переменной, мы можем сделать что-то вроде следующего.

resource "aws_security_group" "example" {
  name = "example" # can use expressions here

  dynamic "ingress" {
    for_each = var.service_ports
    iterator = "service_port"
    content {
      from_port = service_port.value
      to_port   = service_port.value
      protocol  = "tcp"
    }
  }
}

переименовывая временную переменную, хранящую элемент var.service_ports в каждой итерации в лямбда-выражении изимя по умолчанию от ingress до service_port.Основное добавленное значение, которое я вижу в этом (и аналогично, когда я использую его в Groovy для библиотек Jenkins Pipeline), заключается в предоставлении более четкого имени для временной переменной, в которой хранится значение, для улучшения читабельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...