如果我们创建多个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
列表?
所以
- 主机 0 = 子网 A
- 主机 1 = 子网 B
- 主机 2 = 子网 C
- 主机 3 = 子网 A(即循环到第一个元素(。
例如,Python有itertools.cycle
如何在Terraform的声明式语言中实现循环?
element
函数会自动执行此操作,在序列末尾环绕。这几乎是该函数的主要用途,因为他们引入了您在那里使用的带有方括号的切片表示法。
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)]
}
第一个选项在需要使用方括号切片表示法时更常见,当您不需要环绕时更常见。