terraform中的二维数组支持

时间:2019-08-30 06:48:35

标签: terraform

假设以下伪代码:

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能够迭代二维数组吗?

1 个答案:

答案 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 } } } ,因此将导致资源实例地址类似countimportant_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的官方文档以了解其含义。