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里指定:
- 在
variables.tf新增变量:
variable "kv_user_secret_name" { type = string }
- 修改
data.tf中的数据源:
data "azurerm_key_vault_secret" "test" { name = var.kv_user_secret_name key_vault_id = data.azurerm_key_vault.test.id }
- 在
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工作区,在数据源中根据工作区自动选择密钥:
- 创建工作区:
terraform workspace new dev terraform workspace new test
- 修改
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
相关产品推荐
相关产品推荐

