Terraform Lookup函数无法读取变量默认值问题求助
Terraform Lookup函数无法读取默认值的解决方案
问题核心
你的Lookup函数没生效,根本原因是变量验证阶段就失败了,Terraform没机会执行到module里的Lookup逻辑。错误提示明确说明coredns_vm_2缺少必填的datastore_name字段——因为你在variable "vm"的object定义里,把datastore_name设为了必填的string类型,没有标记为可选或设置默认值。
解决方案
步骤1:修改变量定义,允许datastore_name可选
更新variable "vm"的类型定义,使用optional(string)标记datastore_name为可选字段(需Terraform 0.14及以上版本支持):
variable "vm" { type = map(object({ network = map(list(string)) vmname = string vmgateway = string datastore_name = optional(string) # 标记为可选字段 })) }
如果需要给datastore_name设置默认null值,也可以写成:
variable "vm" { type = map(object({ network = map(list(string)) vmname = string vmgateway = string datastore_name = optional(string, null) # 可选且默认值为null })) }
步骤2:优化module中的取值逻辑
现在变量允许缺失datastore_name,可以用两种方式处理默认值:
- 继续使用
lookup函数:
datastore = lookup(each.value, "datastore_name", var.datastore_name[var.vsphere_datacentre])
- 或者用
coalesce函数(更直观处理null值场景):
datastore = coalesce(each.value.datastore_name, var.datastore_name[var.vsphere_datacentre])
额外注意:修正tfvars中的中文引号
你的tfvars配置里用了中文引号(比如“idev”),这会导致Terraform语法错误,需要全部替换为英文双引号("idev")。
原理说明
原来的变量定义中,datastore_name是必填的string类型,Terraform在解析tfvars时会严格校验每个vm对象必须包含该字段,直接抛出错误,根本不会执行到module里的Lookup逻辑。只有将字段标记为可选后,Terraform才会允许对象缺失该字段,此时Lookup函数才能正常读取默认值。
内容的提问来源于stack exchange,提问作者Gowthamakanthan Gopal
相关产品推荐
相关产品推荐

