You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform报错‘Variables not allowed’:无法从data.tf给变量赋值求助

问题原因

你在test.tfvars里用${data.azurerm_key_vault_secret.test.value}给变量赋值的做法是错误的——Terraform的tfvar文件仅支持传入静态值,不能引用数据源、资源这类动态表达式,也不允许使用插值语法,这就是报错"Variables not allowed"的原因。

正确实现方式

方式一:直接在配置中使用密钥库值(推荐)

不需要通过输入变量中转,直接在需要使用user_name的资源/模块里引用数据源的结果:

# 示例:在虚拟机资源中使用密钥值作为管理员用户名
resource "azurerm_virtual_machine" "example" {
  # 其他配置项...
  os_profile {
    admin_username = data.azurerm_key_vault_secret.test.value
  }
}

如果必须保留user_name变量,可以给变量设置默认值为数据源结果,同时保留通过tfvars覆盖的能力:

# variables.tf
variable "user_name" {
  type      = string
  sensitive = true
  default   = data.azurerm_key_vault_secret.test.value
}

方式二:按环境指定密钥名称

如果不同环境的密钥名称不同,可以把密钥名做成输入变量,在对应环境的tfvars里指定:

  1. 在variables.tf新增变量:
variable "kv_user_secret_name" {
  type = string
}
  1. 修改data.tf中的数据源:
data "azurerm_key_vault_secret" "test" {
  name         = var.kv_user_secret_name
  key_vault_id = data.azurerm_key_vault.test.id
}
  1. 在test.tfvars中指定测试环境的密钥名:
kv_user_secret_name = "test-env-user-name"

dev.tfvars中指定开发环境的密钥名:

kv_user_secret_name = "dev-env-user-name"

之后在配置里直接用data.azurerm_key_vault_secret.test.value即可。

方式三:通过环境变量传递

先用Azure CLI获取密钥值,再设置Terraform识别的环境变量:

# Bash示例
export TF_VAR_user_name=$(az keyvault secret show --name my-key-vault-key-name --vault-name <你的密钥库名称> --query value -o tsv)

执行terraform plan或apply时,Terraform会自动读取这个环境变量给user_name赋值,无需修改tfvars文件。

方式四:用工作区区分环境

创建对应环境的Terraform工作区,在数据源中根据工作区自动选择密钥:

  1. 创建工作区:
terraform workspace new dev
terraform workspace new test
  1. 修改data.tf的数据源配置:
data "azurerm_key_vault_secret" "test" {
  name         = terraform.workspace == "dev" ? "dev-user-name" : "test-user-name"
  key_vault_id = data.azurerm_key_vault.test.id
}

切换工作区后,Terraform会自动拉取对应环境的密钥。

内容的提问来源于stack exchange,提问作者ssw1969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:15:37