假设以下伪代码:
resource "important_resource" "very_important_name" {
count = length(var.vip_array)
very_important_parameter {
count = length(var.vip_array[count], vips)
name = lookup(var.vip_array[count][count], vip.name)
surname = lookup(var.vip_array[count][count], vip.surname)
}
}
比方说,vip_array的长度是3,如果每个vip_array元素我都有2个非常重要的人的名字和姓氏。
terraform能够迭代二维数组吗?
答案 0 :(得分:0)
有了这样一个一般的,人为的初始示例,在这里很难显示出真正的解决方案,但是我将讨论所涉及的一般模式,希望您可以将其适应您的实际问题。
您的目标似乎是每个第一级列表元素都拥有一个该资源的实例,然后在每个实例内的第二级列表元素中产生一个0110
块。为此,您可以使用very_important_parameter
处理第一级,并使用dynamic
block处理第二级:
count
由于它使用resource "important_resource" "very_important_name" {
count = length(var.vip_array)
dynamic "very_important_parameter" {
for_each = var.vip_array[count.index]
content {
name = very_important_parameter.value.name
surname = very_important_parameter.value.surname
}
}
}
,因此将导致资源实例地址类似count
,important_resource.very_important_name[0]
等。如果您在{{1 }},这将导致元素的索引发生更改,从而可能导致实例更新数量超过您的期望。如果相反,您可以为每个实例定义一个逻辑名,然后将important_resource.very_important_name[1]
更改为键是那些逻辑名的映射,则可以使用资源级别的var.vip_array
: / p>
var.vip_array
这样做的好处是Terraform随后将通过其地图键跟踪各个实例。如果您有地图键for_each
,则Terraform会创建一个地址为resource "important_resource" "very_important_name" {
for_each = var.vip_map
dynamic "very_important_parameter" {
for_each = each.value
content {
name = very_important_parameter.value.name
surname = very_important_parameter.value.surname
}
}
}
的实例,然后在将来,如果您要从地图中删除该元素,Terraform将知道它只需要销毁一个与该元素相关联的实例,并且不会干扰其他任何实例。
请注意,Terraform中这种类型的常规术语是“列表”,而不是“数组”。尽管可以随意命名变量,但最好遵循Terraform的常规命名方式,以便将来配置的维护者可以更轻松地参考Terraform的官方文档以了解其含义。