作为Terraform 0.12 嵌套 for 循环的后续。我试图从嵌套循环中生成一个对象,但失败得很惨:(
您将如何进行生产:
Outputs:
association-list = {
"policy1" = "user1"
"policy2" = "user1"
"policy2" = "user2"
}
Run Code Online (Sandbox Code Playgroud)
从:
iam-policy-users-map = {
"policy1" = [ "user1" ]
"policy2" = [ "user1", "user2" ]
}
Run Code Online (Sandbox Code Playgroud)
我尝试了许多变体:
variable iam-policy-users-map {
default = {
"policy1" = [ "user1" ]
"policy2" = [ "user1", "user2" ]
}
}
locals {
association-map = merge({
for policy, users in var.iam-policy-users-map : {
for user in users : {
policy => user
}
}
})
output association-map {
value = local.association-map
}
Run Code Online (Sandbox Code Playgroud)
到目前为止成功率为零。根据变化仅设法获得以下内容:
错误:无效的“for”表达式。'for' 表达式结束后的额外字符。
错误:缺少属性值。需要一个由等号 ("=") 引入的属性值。
错误:无效的“for”表达式。构建对象时需要键表达式。
错误:缺少键/值分隔符。需要等号 ("=") 来标记属性值的开头。
作为参考,以下代码能够生成地图列表:
variable iam-policy-users-map {
default = {
"policy1" = [ "user1" ]
"policy2" = [ "user1", "user2" ]
}
}
locals {
association-list = flatten([
for policy, users in var.iam-policy-users-map : [
for user in users : {
user = user
policy = policy
}
]
])
}
output association-list {
value = local.association-list
}
Run Code Online (Sandbox Code Playgroud)
输出:
关联列表 = [ { “policy” = “policy1” “user” = “user1” }, { “policy” = “policy2” “user” = “user1” }, { “policy” = “policy2” “user” = "用户 2" }, ]
部分答案可以在https://github.com/hashicorp/terraform/issues/22263找到。长话短说:这是一个愚蠢的尝试,地图不能包含重复的键。
然而,我仍然有兴趣了解如何从嵌套的 for 循环生成地图地图。请参阅上面的第二个代码示例,生成地图列表。
编辑:在上面链接的 github 问题上给出了完整的答案。
“这(显然)是一个无用的结构,但我想说明这是可能的:
locals {
association-list = {
for policy, users in var.iam-policy-users-map:
policy => { // can't have the nested for expression before the key!
for u in users:
policy => u...
}
}
}
Outputs:
association-list = {
"policy1" = {
"policy1" = [
"user1",
]
}
"policy2" = {
"policy2" = [
"user1",
"user2",
]
}
}
Run Code Online (Sandbox Code Playgroud)
”
| 归档时间: |
|
| 查看次数: |
14086 次 |
| 最近记录: |