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(推荐)
这种方式将每个服务器的凭据单独存储,便于后续权限管理和访问控制,同时可以为每个服务器生成独立密码。
- 调整密码生成资源,为每个服务器生成独立密码:
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 }
- 遍历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
相关产品推荐
相关产品推荐

