使用Terraform中的for_each迭代列表并获取索引值

67次阅读
没有评论

问题描述

在使用Terraform时遇到一个问题。他希望使用for_each迭代一个列表,并在资源标签中使用索引值,但似乎键和值是相同的。他已经尝试了一些方法,但最终得到了不符合预期的结果。他想知道自己错过了什么。

解决方案

在Terraform中,可以使用for_each来迭代一个列表,但是要注意for_each的工作方式和索引的获取方法。

使用for_eachindex函数获取索引

用户提到了一个可以解决问题的简单方法,即使用Terraform的index函数。这个函数可以获取某个元素在列表中的索引。

以下是一个示例,演示如何在Terraform中使用for_eachindex函数来实现所需的结果:

resource "aws_vpc" "vpc" {
  for_each = toset(var.vpc_cidrs)
  cidr_block = each.value

  tags = {
    Name = "Company0${index(var.vpc_cidrs, each.value) + 1}"
  }
}

在这个示例中,我们使用了for_each来迭代var.vpc_cidrs列表中的每个元素。然后,我们使用each.value作为cidr_block,即CIDR块。

在标签部分,我们使用了index函数来获取当前CIDR块在列表中的索引值。注意,索引值从0开始,因此我们在标签中加上了1来得到预期的标签值。

使用index函数的好处是,它允许我们根据列表中的元素来获取索引,而不需要维护一个额外的计数器变量。

关于使用count的另一种方法

除了使用for_eachindex函数,还有一种使用count的方法来实现相同的效果。这种方法会使用列表中元素的位置作为索引,而不是index函数。

以下是使用count来实现相同效果的示例:

resource "aws_vpc" "vpc" {
  count = length(var.vpc_cidrs)
  cidr_block = var.vpc_cidrs[count.index]

  tags = {
    Name = "Company0${count.index + 1}"
  }
}

在这个示例中,我们使用了count来迭代var.vpc_cidrs列表的每个元素。通过count.index可以获取当前元素的索引值。与之前一样,在标签中我们加上了1来得到预期的标签值。

总结

使用Terraform的for_each来迭代列表是一个强大的功能,可以更加灵活地管理资源。使用index函数或count.index变量可以获取元素在列表中的索引值,从而满足不同的需求。

注意: 在实际使用时,用户需要根据自己的需求选择适合的方法,并根据Terraform的版本和文档进行调整。

以上解决方案中提供的代码示例仅供参考,请根据实际情况进行适当的调整和修改。

正文完