Terraform多层Map变量类型定义报错求助
解决Terraform多层Map结构变量类型不匹配的问题
情况1:每个DB服务器仅对应单个数据库
你的本地变量中,每个dbserver的databases是单个对象,而非键值对形式的Map。因此变量定义里的databases类型需要修正为object,而非map(object(...)):
variable "database_servers" { type = map(object({ storage = number db_version = string databases = object({ name = string collation = string charset = string }) })) }
错误原因
之前的变量定义将databases声明为map(object(...)),Terraform会期望它是一个键值对集合(比如{ mgmt = { ... } }),但你的实际数据中databases是直接包含name等属性的单个对象,导致类型校验失败。报错提示"element 'name': object required",本质是Terraform误把name当成了Map的键,而键对应的值应该是object,但实际并非如此。
情况2:每个DB服务器对应多个数据库
如果你的需求是每个服务器可以包含多个数据库,需要先调整本地变量的结构,将databases改为键值对形式的Map:
locals { dbservers = { managementDBserver = { storage = 32768 db_version = "12" databases = { mgmt = { name = "mgmt" collation = "en_US.utf8" charset = "utf8" } } } reportingDBserver = { storage = 32768 db_version = "12" databases = { reports = { name = "reports" collation = "en_US.utf8" charset = "utf8" } } } coreDBserver = { storage = 32768 db_version = "12" databases = { core = { name = "core" collation = "en_US.utf8" charset = "utf8" } } } } }
此时你最初的变量定义即可正常工作:
variable "database_servers" { type = map(object({ storage = number db_version = string databases = map(object({ name = string collation = string charset = string })) })) }
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

