gpt4 book ai didi

azure - Terraform 扁平化和模块内循环问题

转载 作者:行者123 更新时间:2023-12-03 05:19:17 24 4
gpt4 key购买 nike

我正在尝试在 Terraform 中创建一个模块来创建 Azure 资源并面临一些问题。此模块创建资源组、子网、vnet 和角色绑定(bind)。我看到下面的代码由于循环而创建了两次资源。 for_each 循环的工作方式是否是每次循环时都会执行整个资源或模块 block ?我是 Terraform 新手,有 Java 背景。另外,理想情况下希望在没有本地人的情况下使用模块内部的展平,有什么方法可以做到这一点?代码如下。

locals {
groupsbyrole = flatten([
for roleName, groupList in var.testproject1_role_assignments : [
for groupName in groupList : {
role_name = roleName
group_name = groupName
}
]
])
}

module "testproject1" {
source = "C:\\Users\\ebo1h8h\\Documents\\Project\\Automation\\Terraform\\Code\\Azure\\modules\\sandbox-module"
short_name = "testproj"
# Resource Group Variables
az_rg_location = "eastus"
az_tags = {
Environment = "Sandbox"
CostCenter = "Department"
ResourceOwner = "Vikram"
Project = "testproj"
Role = "Resource Group"
}
address_space = ["10.0.0.0/16"]
subnet_prefixes = ["10.0.1.0/24"]
subnet_names = ["a-npe-snet01-sbox"]
vnet_location = var.az_rg_location
for_each = {
for group in local.groupsbyrole : "${group.role_name}.${group.group_name}}" => group
}
principal_id = each.value.group_name
role_definition_name = each.value.role_name
}

这是 role_assignments 变量

variable "testproject1_role_assignments" {
type = map(list(string))
default = {
"Contributor" = ["prod-azure-contrib-sbox", "gcp-org-network-engineering"],
"Owner" = ["gcp-org-cloud-delivery"]
}
}

上面的代码创建了 12 个资源,而它应该只有 6 个。我唯一能够解决这个问题的方法是将资源“azurerm_role_assignment”“role_assignment”作为单独的模块。理想情况下,我想在每个要创建的模块中传递角色分配变量,以便它创建一组资源。

有关于如何实现这一目标的指导吗?

谢谢

最佳答案

docs状态

If a resource or module block includes a for_each argument whose value is a map or a set of strings, Terraform will create one instance for each member of that map or set.

因此,在您的场景中,您正在创建该模块的 3 个实例,而听起来您想要将 local.groupsbyrole 对象作为模块中的变量传递,并且仅将 for_each 附加到您想要多个实例的资源。

旁注:您可以通过添加组来简化本地操作,如下所示:

locals {
groupsbyrole = flatten([
for roleName, groupList in var.testproject1_role_assignments : [
for groupName in groupList : {
role_name = roleName
group_name = groupName
group = "${roleName}.${groupName}"
}
]
])
}

提示:我发现在开发时添加输出来查看对象的形状也很有用

output "test_output" {
value = local.groupsbyrole
}

然后,当您运行计划时,您将看到您的对象

test_output = [
+ {
+ group = "Contributor.prod-azure-contrib-sbox"
+ group_name = "prod-azure-contrib-sbox"
+ role_name = "Contributor"
},
+ {
+ group = "Contributor.gcp-org-network-engineering"
+ group_name = "gcp-org-network-engineering"
+ role_name = "Contributor"
},
+ {
+ group = "Owner.gcp-org-cloud-delivery"
+ group_name = "gcp-org-cloud-delivery"
+ role_name = "Owner"
},
]

关于azure - Terraform 扁平化和模块内循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73548616/

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