我在variables.tf
中声明了一个变量,如下所示:
variable "MyAmi" {
type = map(string)
}
但是当我这样做时:
terraform plan -var 'MyAmi=xxxx'
我得到:
Error: Variables not allowed
on <value for var.MyAmi> line 1:
(source code not available)
Variables may not be used here.
最小代码示例:
test.tf
provider "aws" {
}
# S3
module "my-s3" {
source = "terraform-aws-modules/s3-bucket/aws"
bucket = "${var.MyAmi}-bucket"
}
variables.tf
variable "MyAmi" {
type = map(string)
}
terraform plan -var 'MyAmi=test'
Error: Variables not allowed
on <value for var.MyAmi> line 1:
(source code not available)
Variables may not be used here.
有什么建议吗?
答案 0 :(得分:1)
我看到可能导致您看到错误的两件事。链接到terraform plan
documentation。
运行terraform plan
时,它将自动加载当前目录中的所有.tfvars
文件。如果您的.tfvars
文件在另一个目录中,则必须将其作为-var-file
参数提供。您在问题中说您的变量在文件variables.tf
中,这意味着terraform plan
命令不会自动加载该文件。 FIX:将variables.tf
重命名为variables.tfvars
使用-var
参数时,应确保HCL正确解释要传递给它的内容。如果您要传递的变量是一个映射,则该变量必须可解析为映射。
我期望的不是terraform plan -var 'MyAmi=xxxx'
,而是terraform plan -var 'MyAmi={"us-east-1":"ami-123", "us-east-2":"ami-456"}'
。
有关声明变量并通过命令行专门传递变量的更多信息,请参见此documentation。
答案 1 :(得分:0)
尝试从动态资源(例如,子模块的输出)设置变量的值时,也会发生此错误:
{
"message" : {
"_0": "first part ",
"_1": "after first variable. ",
"_2": "after another variable"
}
}
使用${message._0}${variable}${message._1}${var2}${message._2}
块代替变量将解决此问题:
variable "some_arn" {
description = "Some description"
default = module.some_module.some_output # <--- Error: Variables not allowed
}
答案 2 :(得分:0)
我遇到了同样的错误,但就我而言,我忘记将变量值括在 terraform.tfvars 文件中的引号 (" ") 内。
这在官方 terraform 存储库中记录为问题: https://github.com/hashicorp/terraform/issues/24391