在Terraform中将json转换为yaml



我们如何从json 生成yaml-out

{
"users":[
{
"name":"rock",
"age":33,
"city":"paris"
},
{
"name":"austin",
"age":45,
"city":"greece"
}
]
}

带有随机密码的附加字段的预期输出

users:
- key: 'user[0].name'
value: rock
- key: 'user[0].age'
value: '33'
- key: 'user[0].city'
value: paris
- key: 'user[0].password'
value: '5]L+J7rA*<7+:PO6'
- key: 'user[1].name'
value: austin
- key: 'user[1].age'
value: '45'
- key: 'user[1].city'
value: greece
- key: 'user[1].password'
value: P=x&385YGMI0?!Is

这些文件仅在本地计算机上使用。

从JSON到YAML的直接转换只需要将jsondecode的结果传递给yamlencode

然而,问题的实质似乎不是序列化格式之间的转换,而是使用复合键语法将典型的嵌套数据结构转换为扁平结构。

从多级结构到单级结构的转换对于flatten:来说是一项很好的工作

locals {
users = flatten([
for idx, u in local.users : [
for k, v in u : {
key   = "user[${idx}].${v}"
value = v
}
]
])
}

结果将是对应于您在YAML:中所示的数据结构的Terraform值

[
{
key   = "user[0].name"
value = "rock"
},
{
key   = "user[0].age"
value = 33
},
# ...etc...
]

然后,您可以将结果传递给yamlencode,以生成该数据结构的YAML序列化。

您可以使用terraform的file函数来读取json的内容。

然后,您可以使用jsondecode将字符串解码/表示为json。

最后一步是使用,yamlencode函数以yaml格式对返回的json表示进行编码。

请参阅下面的地形配置。

locals {
test = yamlencode(jsondecode(file("${path.module}/test.json")))
}
output "test" {
value = local.test
}

上述tf配置的结果如下

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
test = "users":
- "age": 33
"city": "paris"
"name": "rock"
- "age": 45
"city": "greece"
"name": "austin"
locals {
users = jsondecode(file("${path.module}/user.json"))
}
resource "random_string" "password" {
count =  length(local.users.users)
length = 16
special = true
}
output "pass" {
value = random_string.password

}
locals {
user_flat = yamlencode(flatten([for i,j  in local.users.users:[
for k,v in j : {
key = "user.[${i}].${k}"
"value" = v
} 
]
]
)
)
out = yamlencode({"users"= local.user_flat}) 
}
output "Desired_output" {
value = local.out
}

试试这个代码。

Outputs:
Desired_output = <<EOT
"users": |
- "key": "user.[0].age"
"value": 23
- "key": "user.[0].city"
"value": "barcelona"
- "key": "user.[0].name"
"value": "john"
- "key": "user.[1].age"
"value": 29
- "key": "user.[1].city"
"value": "london"
- "key": "user.[1].name"
"value": "bob"
EOT
pass = [
{
"id" = "XEXj*svXm@d&_%Fn"
"keepers" = tomap(null) /* of string */
"length" = 16
"lower" = true
"min_lower" = 0
"min_numeric" = 0
"min_special" = 0
"min_upper" = 0
"number" = true
"override_special" = tostring(null)
"result" = "XEXj*svXm@d&_%Fn"
"special" = true
"upper" = true
},
{
"id" = "Ews%V%Xk[YBd]D_M"
"keepers" = tomap(null) /* of string */
"length" = 16
"lower" = true
"min_lower" = 0
"min_numeric" = 0
"min_special" = 0
"min_upper" = 0
"number" = true
"override_special" = tostring(null)
"result" = "Ews%V%Xk[YBd]D_M"
"special" = true
"upper" = true
},
]

相关内容

最新更新