gpt4 book ai didi

terraform - for_each 是从 Terraform 集中检索值的唯一方法吗?

转载 作者:行者123 更新时间:2023-12-03 20:05:01 28 4
gpt4 key购买 nike

Terraform 最近引入了 set 数据类型,将 on this page 描述为:

set(...): a collection of unique values that do not have any secondary identifiers or ordering.


很难找到有关如何从 Terraform 集中检索值的文档。使用 map ,您可以索引键:
password = var.passwords["kevin"]
使用列表,您可以索引元素编号:
a_record = var.records[1]
但是,我不能使用这两种方法中的任何一种从集合中检索值,即使是只有一个项目的集合。
在其他地方,文档提到 for_each 作为从集合中获取值的方法。
variable "subnet_ids" {
type = list(string)
}

resource "aws_instance" "server" {
for_each = toset(var.subnet_ids)

ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
subnet_id = each.key # note: each.key and each.value are the same for a set

tags = {
Name = "Server ${each.key}"
}
}
for_each 元变量是访问集合中值的唯一方法吗?

最佳答案

您还可以通过首先将集合转换为列表然后将其作为列表访问来对集合进行切片。
举个例子:

variable "set" {
type = set(string)
default = [
"foo",
"bar",
]
}

output "set" {
value = var.set
}

output "set_first_element" {
value = var.set[0]
}
这会出错,因为集合不能被索引直接访问:
Error: Invalid index

on main.tf line 14, in output "set_first_element":
14: value = var.set[0]

This value does not have any indices.
如果您改为使用 tolist function 进行转换,那么您可以按预期访问它:
output "set_to_list_first_element" {
value = tolist(var.set)[0]
}
Outputs:

set = [
"bar",
"foo",
]
set_to_list_first_element = bar
请注意,这将返回 bar 而不是 foo 。严格来说,Terraform 中的集合是无序的,因此您根本不能依赖顺序,并且仅在 Terraform 的单次运行期间保持一致,但实际上它们是稳定的,在 set(string) they are sorted in lexicographical order 的情况下:

When a set is converted to a list or tuple, the elements will be in an arbitrary order. If the set's elements were strings, they will be in lexicographical order; sets of other element types do not guarantee any particular order of elements.


出现这种情况的主要地方是,如果您正在处理在 Terraform 0.12 中返回集合类型但需要使用奇异值的资源或数据源。一个基本的例子可能是这样的:
data "aws_subnet_ids" "private" {
vpc_id = var.vpc_id

tags = {
Tier = "Private"
}
}

resource "aws_instance" "app" {
ami = var.ami
instance_type = "t2.micro"
subnet_id = tolist(data.aws_subnet_ids.example.ids)[0]
}
这将在标记有 Tier = Private 的子网中创建一个 EC2 实例,但不会对其应该在哪里设置其他限制。
当您提到能够使用 for_each 访问值时,您还可以使用 for expression 循环访问一个集合:
variable "set_of_objects" {
type = set(object({
port = number
service = string
}))

default = [
{
port = 22
service = "ssh"
},
{
port = 80
service = "http"
},
]
}

output "set_of_objects" {
value = var.set_of_objects
}

output "list_comprehension_over_set" {
value = [ for obj in var.set_of_objects : upper(obj.service) ]
}
然后输出以下内容:
list_comprehension_over_set = [
"SSH",
"HTTP",
]
set_of_objects = [
{
"port" = 22
"service" = "ssh"
},
{
"port" = 80
"service" = "http"
},
]

关于terraform - for_each 是从 Terraform 集中检索值的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63196157/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com