Terraform如何正确传递对象列表作为输入参数?
向Terraform传递对象列表类型输入参数的正确语法
变量定义
variable "app_env_vars" { type = list(object({ name = string value = optional(string) })) }
正确的命令行传递语法
针对字符串类型的属性值,需兼顾shell引号规则与Terraform的HCL语法,以下是可行写法:
写法1:单引号包裹整个变量值,内部字符串直接写
terraform plan -var='app_env_vars=[{name=ASPNETCORE_ENVIRONMENT,value=Development},{name=ASPNETCORE_URLS,value=http://+:80}]'
写法2:字符串含特殊字符时,转义内部单引号
如果字符串包含空格、shell特殊符号,可通过转义单引号包裹单个属性值:
terraform plan -var='app_env_vars=[{name=ASPNETCORE_ENVIRONMENT,value='\''Development'\'','name=ASPNETCORE_URLS,value='\''http://+:80'\'']'
写法3:通过环境变量传递(复杂场景推荐)
设置TF_VAR_前缀的环境变量,避免命令行引号冲突:
export TF_VAR_app_env_vars='[{name=ASPNETCORE_ENVIRONMENT,value=Development},{name=ASPNETCORE_URLS,value=http://+:80}]' terraform plan
常见错误原因解析
- 键值分隔符错误:命令行传递变量时,Terraform仅识别
key=value格式,使用key:value会触发语法解析失败。 - 引号冲突:外层用双引号时,内部双引号会被shell解析,导致Terraform无法识别字符串边界;无引号的特殊字符会被shell拆分,引发错误。
- 包裹符号错误:列表必须用
[]、对象必须用{}包裹,混用或遗漏会触发"Expected a newline or comma"类报错。
验证有效的简化示例
当属性值为数字时,无需额外引号,以下写法均有效:
terraform plan -var=app_env_vars="[{name=1,value=2},{name=3,value=4}]" terraform plan -var="app_env_vars=[{name=1,value=2},{name=3,value=4}]" terraform plan -var='app_env_vars=[{name=1,value=2},{name=3,value=4}]'
内容的提问来源于stack exchange,提问作者AllmanTool
相关产品推荐
相关产品推荐

