I have a map like this:
vault_secrets:
path1:
- audit_db_service
- sys_admin_role
path2:
- mis
- jml_snow_service
and from there, I like to have a resultant map, like:
{
"path1/audit_db_service" = "auditdb"
"path1/sys_admin_role" = "sysadmin"
"path2/mis" = "mis"
....
}
I came up with this:
[
for K1,V1 in var.vault_secrets : merge({
for v2 in V1 : "${K1}/${v2}" => join(
"", slice(split("_",v2),0,length(
split("_",v2))>1 ? (length(split("_",v2))-1) : 1
)
)
})
]
which, gives me this result:
[
{
"path1/audit_db_service" = "auditdb"
"path1/sys_admin_role" = "sysadmin"
},
{
"path2/jml_snow_service" = "jmlsnow"
"path2/mis" = "mis"
},
]
and that’s where I got stuck. Can anyone give me a git of hands pls?
Also, any idea why that merge(...)
in my code doesn’t work?
-S
try this with your input variable:
locals {
myres = [
for K1, V1 in var.vault_secrets : merge({
for v2 in V1 : "${K1}/${v2}" => join(
"", slice(split("_", v2), 0, length(
split("_", v2)) > 1 ? (length(split("_", v2)) - 1) : 1
)
)
})
]
myres2 = merge([for k1, v1 in var.vault_secrets : { for k2 in v1 : "${k1}/${k2}" => join(
"", slice(split("_", k2), 0, length(
split("_", k2)) > 1 ? (length(split("_", k2)) - 1) : 1
)) }]...)
}
variable "vault_secrets" {
type = map(list(string))
default = { path1 = ["audit1", "sys_admin"], path2 = ["mis", "jml_snow"] }
}
output "result" {
value = local.myres
}
output "result2" {
value = local.myres2
}
1 Like
% terraform plan
Changes to Outputs:
+ result = [
+ {
+ path1/audit1 = "audit1"
+ path1/sys_admin = "sys"
},
+ {
+ path2/jml_snow = "jml"
+ path2/mis = "mis"
},
]
+ result2 = {
+ path1/audit1 = "audit1"
+ path1/sys_admin = "sys"
+ path2/jml_snow = "jml"
+ path2/mis = "mis"
}
thanks @tbugfinder !!
Looks like that’s all what I wanted but let me try and confirm.