Terraform 在对象映射上循环
如何对以下各项执行Terraform 在对象映射上循环,terraform,Terraform,如何对以下各项执行循环 我想创建一个tfe\u变量node\u count&vm\u size。 我需要wksp1和wksp2中的这两个tfe_变量 variable "custom_variables" { type = map(object({ node_count = number vm_size = string })) default = { wksp1 = { node_count = 2 vm_size =
循环
我想创建一个tfe\u变量
node\u count
&vm\u size
。
我需要wksp1
和wksp2
中的这两个tfe_变量
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
}
你真的很接近!这里有几件事需要考虑:
选项1:多个tfe_变量
资源
为要创建的每个变量创建一个tfe\u变量
资源
确保custom_variables
map中的键是工作区ID
此选项的缺点是,每个变量都需要额外的资源
选项2:可变对象列表
定义每个变量的键、值和工作区ID的列表
使用count
迭代列表
这种方法也有几个缺点:
- 变量定义中存在大量重复代码
- 该值必须始终为同一类型
如果您在Terraform中挣扎于循环概念,可能会对您有所帮助。对于每个
来说,需要记住的主要要求是,我们始终需要创建一个地图,该地图对于我们要创建的资源的每个实例都有一个元素。在本例中,这意味着您需要一个映射,其中每个工作区每个变量有一个元素,因为tfe_variable
描述了单个工作区上的单个变量
然后,我们的工作是编写一个表达式,将通过变量传入的对象值映射到每个变量都有一个单独元素的集合。这里有一种方法可以做到这一点,使用的方式类似于:
上面应该生成一个local.workspace\u 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_变量
实例有一个元素的要求,因此我们剩下的唯一工作是将其投影到一个映射中,为每个元素提供唯一标识符,并描述如何基于这些对象填充tfe_变量
参数:
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
}
有一件事我没有在上面讨论,因为这不是您直接提出的问题,那就是tfe\u变量中workspace\u id
的值。如果我没记错的话,该参数需要的是工作区id而不是工作区名称,在这种情况下,workspace\u id
参数可能需要稍微复杂一点的表达式。如果您已经有一个tfe_工作区
资源使用工作区名称作为键,那么类似的操作可能会起作用,例如:
workspace_id = tfe_workspace.example[each.value.workspace].id
如果您的工作区是以不同的方式创建的,那么您可能需要在这里做一些更复杂的事情,但这与您最初问题的主题相去甚远,因此我不会在这里深入探讨。如果你愿意的话,我很乐意在这个网站上用一个单独的问题来帮助你。无论如何,我不需要硬编码计划中的键“node\u count”和“vm\u size”。例如,如果我只是在稍后使用新变量更新自定义变量,我会使用一个替代选项更新答案。不幸的是,这种方法也有缺点,但我看不到最佳方法。
[
{ 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" },
]
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_workspace.example[each.value.workspace].id