You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform生成SQL登录信息转JSON上传HashiCorp Vault报错求助

问题解决:Terraform上传SQL Server凭据到HashiCorp Vault报错

错误原因

vault_kv_secret_v2的data_json参数要求传入JSON对象(对应Terraform中的map类型),但你当前的local.sql_server_login_info是数组类型,JSON编码后为数组结构,不符合Vault KV v2存储的格式要求,因此抛出cannot unmarshal array into Go value of type map[string]interface {}错误。

解决方案

根据你的需求,提供两种可行方案:

方案一:为每个SQL Server创建独立的Vault Secret(推荐)

这种方式将每个服务器的凭据单独存储,便于后续权限管理和访问控制,同时可以为每个服务器生成独立密码。

  1. 调整密码生成资源,为每个服务器生成独立密码:
resource "random_string" "password" {
  for_each            = var.sql_servers
  length              = 20
  upper               = true
  min_upper           = 1
  lower               = true
  min_lower           = 1
  number              = true
  min_numeric         = 1
  special             = false
}
  1. 遍历SQL Server列表,创建独立的Vault Secret:
resource "vault_kv_secret_v2" "sql_vault" {
  for_each = var.sql_servers
  depends_on = [azurerm_mssql_server.server]
  mount     = "dba-info"
  name      = "sql-servers/${each.key}" # 每个服务器对应独立路径,例如sql-servers/server1
  cas       = 1
  data_json = jsonencode({
    server_name       = each.key
    admin_user        = var.administrator_login
    admin_password    = random_string.password[each.key].result
  })
}

方案二:将所有服务器信息存入同一个Vault Secret

如果需要将所有凭据集中存储在同一个路径下,只需将数组包装到一个JSON对象的字段中:

resource "vault_kv_secret_v2" "sql_vault" {
  depends_on = [azurerm_mssql_server.server]
  mount     = "dba-info"
  name      = "/some/path/in/hashicorp/vault"
  cas       = 1
  data_json = jsonencode({
    sql_server_credentials = local.sql_server_login_info
  })
}

这样编码后的JSON是一个包含数组字段的对象,符合Vault的格式要求。

内容的提问来源于stack exchange,提问作者egrok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 05:35:05