Terraform的for_each中的迭代器功能是什么?

时间:2019-06-04 11:04:56

标签: terraform

我试图了解Terraform 0.12中iterator的{​​{1}}功能。 docs说:

迭代器:

  

for_each参数(可选)设置一个临时变量的名称,该临时变量表​​示复数值的当前元素。如果省略,则变量名称默认为动态块的标签...

但是我找不到使用此功能的任何代码示例,也无法理解其用途。我已经阅读过Terraform 0.12 preview,但此处未提及,我发现了一些GitHub问题(例如this),但那里也找不到任何线索。

仅仅是为了提高可读性吗?我将不胜感激一个超出我在文档中可以找到的代码示例和解释。

1 个答案:

答案 0 :(得分:2)

基本上可以使用各种语言(如Python,Ruby,C ++,Javascript,Groovy等)在Lambda中建立一个临时变量(尤其是如果它是迭代的),该临时变量在Lambda中存储每次迭代的临时值。在某些语言中(例如Groovy),此变量有一个默认名称,或者您可以自己设置一个变量(即Groovy中的默认变量名称为it)。例如,在Groovy中,我们有:

strings.each() {
  print it
}

将打印string变量赋值的内容(假设可以将其强制转换为String)。以下代码具有完全相同的功能:

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

我们已将临时变量明确命名为a_string。这类似于您问题中的iterator参数。因此,在Terraform中,我们在documentation中看到了一个示例:

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"
    }
  }
}

因此将lambda内每次迭代中存储var.service_ports元素的临时变量重命名为默认名称ingressservice_port。我在其中看到的主要附加值(同样,当我在Groovy中将其用于Jenkins Pipeline库时)也为存储该值的临时变量提供了更清晰的名称,以提高可读性。