如何对以下内容执行for_each循环?
我想创建一个tfe_variable node_count & vm_size。我需要这两个tfe_variables,wksp1和wksp2
variable "custom_variables" {
type = map(object({
node_count = number
vm_size = string
}))
default = {
wksp1 = {
node_count = 2
vm_size = "Standard_D2_v3"
},
wksp2 = {
node_count = 5
vm_size = "Standard_D2_v5"
}
}
}
resource "tfe_variable" "custom" {
for_each = {
# for each workspace & variable in var.custom_variables create a tfe_variable
}
key = each.value.name
value = each.value.value
category = "terraform"
workspace_id = each.value.workspace_id
}发布于 2020-05-20 18:59:09
记住for_each的主要要求是,我们总是需要创建一个映射,该映射对于我们想要创建的资源的每个实例都有一个元素。在本例中,这意味着您需要一个每个变量都有一个元素的映射,因为tfe_variable描述了单个工作区上的一个变量。
然后,我们的工作是编写一个表达式,将通过变量传入的对象映射值投影到每个变量都有一个单独元素的集合中。这里有一种方法可以做到这一点,使用函数的方式类似于文档中的一个例子
locals {
workspace_variables = flatten([
for ws_name, ws in var.custom_variables : [
for var_name, value in ws : {
workspace = ws_name
variable = var_name
value = value
}
]
])
}上面的内容应该生成如下所示的local.workspace_variables:
[
{ workspace = "wksp1", variable = "node_count", value = 2 },
{ workspace = "wksp1", variable = "vm_size", value = "Standard_D2_v3" },
{ workspace = "wksp2", variable = "node_count", value = 5 },
{ workspace = "wksp2", variable = "vm_size", value = "Standard_D2_v5" },
]现在,这满足了每个所需的tfe_variable实例都有一个元素的要求,因此我们剩下的唯一工作就是将其投影到一个映射中,为每个元素提供唯一标识符,并描述如何基于这些对象填充tfe_variable参数:
resource "tfe_variable" "custom" {
for_each = {
for wsv in local.workspace_variables : "${wsv.workspace}.${wsv.variable}" => wsv
}
key = each.value.variable
value = each.value.value
category = "terraform"
workspace_id = each.value.workspace
}有一件事我在上面没有争论,因为这不是你直接提出的问题,那就是workspace_id在tfe_variable中的价值。如果我没记错的话,这个参数是期望一个工作区id,而不是一个工作区名称,在这种情况下,您可能需要一个稍微复杂一些的workspace_id参数表达式。如果您已经有了一个使用工作区名称作为键的tfe_workspace资源,那么类似这样的东西可能会起作用,例如:
workspace_id = tfe_workspace.example[each.value.workspace].id如果您的工作空间是以不同的方式创建的,那么您可能需要在这里做一些更复杂的事情,但这与您最初问题的主题相去甚远,所以我不打算在这里深入研究。如果你愿意的话,我很乐意在这个网站的另一个问题上帮助它。
发布于 2020-05-18 23:55:58
你真的很接近!下面是几件需要考虑的事情:
选项1:多个
tfe_variable资源custom_variables映射中的键是工作区ID。variable "custom_variables" {
type = map(object({
node_count = number
vm_size = string
}))
default = {
wksp1_id = {
node_count = 2
vm_size = "Standard_D2_v3"
},
wksp2_id = {
node_count = 5
vm_size = "Standard_D2_v5"
}
}
}
resource "tfe_variable" "node_count" {
for_each = var.custom_variables
key = "node_count"
value = each.value.node_count
category = "terraform"
workspace_id = each.key
}
resource "tfe_variable" "vm_size" {
for_each = var.custom_variables
key = "vm_size"
value = each.value.vm_size
category = "terraform"
workspace_id = each.key
}此选项的缺点是,每个变量都需要额外的资源。
选项2:可变对象列表()
count迭代列表variable "custom_variables" {
type = list(object({
key = string
value = string
workspace_id = string
}))
default = [
{
key = "node_count"
value = "2"
workspace_id = "wksp1_id"
},
{
key = "node_count"
value = "5"
workspace_id = "wksp2_id"
},
{
key = "vm_size"
value = "Standard_D2_v3"
workspace_id = "wksp1_id"
},
{
key = "vm_size"
value = "Standard_D2_v5"
workspace_id = "wksp2_id"
}
]
}
resource "tfe_variable" "custom" {
count = length(var.custom_variables)
key = var.custom_variables[count.index].key
value = var.custom_variables[count.index].value
workspace_id = var.custom_variables[count.index].workspace_id
category = "terraform"
}这种方法也有一些缺点:
如果您正在与Terraform中的循环概念进行斗争,这篇博客文章可能会对您有所帮助。
https://stackoverflow.com/questions/61878210
复制相似问题