使用Terraform部署Vault架构时循环配置遇到问题求助
Terraform部署Vault循环配置问题解决
需要实现遍历JSON配置文件中的每个条目,在Vault的staging kv-v2挂载点下创建对应路径的空密钥,但当前代码无法正确完成循环逻辑,导致资源部署失败。
原main.tf代码
locals { all_data = jsondecode(file("data.json")) config = local.all_data.Config } resource "vault_mount" "staging" { path = "staging" type = "kv-v2" description = "Staging environment secrets" } resource "vault_kv_secret_v2" "config" { for_each = toset(local.config) mount = vault_mount.staging.path name = each.key cas = 1 delete_all_versions = true data_json = jsonencode( { (each.value.NAME) = "" } ) }
原data.json数据文件
{"Config" : [ {"Config/partoo" : { "NAME" : ["apiKey"] }}, {"Config/toucan" : { "NAME" : ["embedErId", "embedSlmId"] }}, {"Config/hubspot" : { "NAME" :["clientId", "clientSecret"] }}, {"Config/sendGrid" : { "NAME" :["key"] }} ]}
问题核心
local.config是数组类型,每个元素是仅含单个键值对的对象,toset(local.config)无法正确提取路径和密钥名称列表;NAME是数组类型,直接作为JSON键会导致格式错误,需将数组中每个密钥名称设为空值。
修改后的代码
main.tf
locals { all_data = jsondecode(file("data.json")) # 将数组中单个键值对的对象合并为统一map,键为路径,值为含NAME数组的对象 config_map = merge(local.all_data.Config...) } resource "vault_mount" "staging" { path = "staging" type = "kv-v2" description = "Staging environment secrets" } resource "vault_kv_secret_v2" "config" { # 用config_map的键作为每个资源实例的唯一标识 for_each = local.config_map mount = vault_mount.staging.path name = each.key cas = 1 delete_all_versions = true # 遍历NAME数组,生成每个密钥名称对应的空值键值对 data_json = jsonencode({ for key in each.value.NAME : key => "" }) }
修改说明
- 数据结构转换:通过
merge(local.all_data.Config...)将原数组转换为键值对结构的map,让for_each能直接遍历路径和对应配置; - 密钥名称处理:用
for表达式遍历NAME数组,为每个密钥名称生成空值映射,符合Vault kv-v2的存储要求; - for_each优化:直接使用map作为
for_each数据源,每个路径对应唯一资源实例,避免数组遍历的类型兼容问题。
内容的提问来源于stack exchange,提问作者Tristan
相关产品推荐
相关产品推荐

