如何在Terraform中动态生成含随机密钥的JSON?
Terraform 实现动态生成PSK映射并输出JSON
你的代码问题在于local变量的map值中不允许使用for_each块,需要改用Terraform的for表达式来动态构造psk的键值映射。同时要保留对local.overrides.foo.connections不存在的兼容处理,以下是修正后的完整实现:
locals { overrides = { foo = { connections = { connection-one = { bool_setting = "true" } connection-two = { string_value = "primary" } } } } # 统一处理connections的存在性,不存在则返回空map connections = try(local.overrides.foo.connections, {}) my_json = { "description" = "blah" "psk" = { # 使用for表达式遍历connections的所有key,关联对应的随机密码 for conn_key in keys(local.connections) : conn_key => random_string.password[conn_key].result } } } resource "random_string" "password" { for_each = local.connections length = 20 special = true } output "json_output" { value = jsonencode(local.my_json) }
关键修改说明
- 复用connections变量:将
try(local.overrides.foo.connections, {})提取为单独的local.connections,避免重复逻辑,提升可读性。 - 用for表达式替代for_each:在
my_json的psk字段中,通过for表达式遍历local.connections的所有key,将每个key映射到对应的random_string.password实例的result属性(原代码遗漏了取result属性,这是生成密码的核心字段)。 - 兼容空场景:当
local.overrides.foo.connections不存在时,local.connections为空map,random_string.password不会创建任何资源实例,最终psk字段会输出空对象,符合预期。
执行terraform apply后,json_output会生成你期望的格式,示例输出如下:
{ "description": "blah", "psk": { "connection-one": "g2rL6IEF1XXp_JL]N<H!", "connection-two": "EVBQvSj@5a9lo:OZ<S_T" } }
内容的提问来源于stack exchange,提问作者170730350
相关产品推荐
相关产品推荐

