我试图了解Terraform 0.12中iterator
的{{1}}功能。 docs说:
迭代器:
for_each
参数(可选)设置一个临时变量的名称,该临时变量表示复数值的当前元素。如果省略,则变量名称默认为动态块的标签...
但是我找不到使用此功能的任何代码示例,也无法理解其用途。我已经阅读过Terraform 0.12 preview,但此处未提及,我发现了一些GitHub问题(例如this),但那里也找不到任何线索。
仅仅是为了提高可读性吗?我将不胜感激一个超出我在文档中可以找到的代码示例和解释。
答案 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
元素的临时变量重命名为默认名称ingress
到service_port
。我在其中看到的主要附加值(同样,当我在Groovy中将其用于Jenkins Pipeline库时)也为存储该值的临时变量提供了更清晰的名称,以提高可读性。