如何在Terraform的tfvars数组中引用random_password资源结果?
问题:如何在tfvars数组中引用random_password的结果?
我创建了如下random_password资源:
resource "random_password" "secret1" { length = 12 special = false numeric = true }
尝试在terraform.tfvars的fields数组中引用该资源结果:
fields = [ { fieldname = "Username" itemvalue = "terraform" }, { fieldname = "Password" itemvalue = random_password.secret1.result } ]
但触发报错:
│ Error: Variables not allowed │ │ on terraform.tfvars line 17: │ 17: itemvalue = random_password.random_secret.result │ │ Variables may not be used here.
请问如何实现不使用静态值,将random_password的结果作为itemvalue?
核心原因
terraform.tfvars是静态变量定义文件,只能存放静态值,不支持引用Terraform资源、数据源或表达式——这就是报错的根源。
正确实现方式
方案1:直接在主配置中定义含动态值的fields
把原本写在tfvars里的fields数组移到主配置文件(比如main.tf),直接引用random_password的结果:
resource "random_password" "secret1" { length = 12 special = false numeric = true } # 定义包含动态密码的本地变量 locals { fields = [ { fieldname = "Username" itemvalue = "terraform" }, { fieldname = "Password" itemvalue = random_password.secret1.result } ] } # 后续资源直接使用local.fields resource "your_target_resource" "example" { fields = local.fields }
方案2:保留tfvars静态部分,主配置中合并动态值
如果需要保留tfvars里静态字段的可配置性,只动态追加密码字段:
- 在
terraform.tfvars中定义静态字段:
static_fields = [ { fieldname = "Username" itemvalue = "terraform" } ]
- 在主配置文件中合并静态变量和动态密码:
# 声明接收静态字段的变量 variable "static_fields" { type = list(object({ fieldname = string itemvalue = string })) default = [] } resource "random_password" "secret1" { length = 12 special = false numeric = true } # 合并静态字段和动态密码 locals { fields = concat( var.static_fields, [ { fieldname = "Password" itemvalue = random_password.secret1.result } ] ) } # 后续资源使用合并后的local.fields resource "your_target_resource" "example" { fields = local.fields }
补充说明
- Terraform的
.tfvars文件仅用于提供静态输入值,所有动态计算、资源引用的逻辑都必须放在.tf配置文件中。 - 如果需要对外暴露可配置项,优先通过
variable定义输入参数,再在主配置中结合动态值生成最终数据结构。
内容的提问来源于stack exchange,提问作者Lieferer
相关产品推荐
相关产品推荐

