循环浏览 Terraform 列表

Cycle through Terraform list

如果我们创建多个 aws_instance 资源:

variable "cluster_size" {
  type = number
  default = 4
}

variable "private_subnets" {
  type = list(string)
  default = ["subnet-a", "subnet-b", "subnet-c"]
}

resource "aws_instance" "cassandra" {
  instance_type = var.instance_type
  count         = var.cluster_size
  ami           = var.ami
  key_name      = var.security_key.name
  subnet_id     = var.private_subnets[count.index]
}

如您所见,我有 3 个私有子网,但有 4 个主机到 运行。如何循环 private_subnets?

的列表

所以

例如 Python 有 itertools.cycle

Terraform的声明式语言如何实现循环?

element function 自动执行此操作,在序列末尾回绕。这几乎是该函数的主要用途,因为他们引入了您在那里使用的带有方括号的切片符号。

variable "cluster_size" {
  type = number
  default = 4
}

variable "private_subnets" {
  type = list(string)
  default = ["subnet-a", "subnet-b", "subnet-c"]
}

resource "aws_instance" "cassandra" {
  instance_type = var.instance_type
  count         = var.cluster_size
  ami           = var.ami
  key_name      = var.security_key.name
  subnet_id     = element(var.private_subnets, count.index)
}

或者,您可以像在其他编程语言中一样使用 % 运算符取模:

variable "cluster_size" {
  type = number
  default = 4
}

variable "private_subnets" {
  type = list(string)
  default = ["subnet-a", "subnet-b", "subnet-c"]
}

resource "aws_instance" "cassandra" {
  instance_type = var.instance_type
  count         = var.cluster_size
  ami           = var.ami
  key_name      = var.security_key.name
  subnet_id     = var.private_subnets[count.index % length(var.private_subnets)]
}

第一个选项在需要环绕时更常见,而在不需要环绕时更常见的是方括号切片符号。