【问题标题】:Terraform outputs 'Error: Variables not allowed' when doing a planTerraform 在执行计划时输出“错误:不允许变量”
【发布时间】:2022-05-05 23:33:42
【问题描述】:

我在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"
}

变量.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.

有什么建议吗?

【问题讨论】:

  • 你能在minimal reproducible example 中重新创建它,我们可以运行并看到同样的错误吗?看起来您错过了引发错误的位,或者解析器只是在某处的堆中摔倒了。

标签: terraform


【解决方案1】:

尝试从动态资源(例如:子模块的输出)设置变量值时也会发生此错误:

variable  "some_arn" {
  description = "Some description"
  default     = module.some_module.some_output # <--- Error: Variables not allowed
}

使用locals 块代替变量将解决此问题:

locals {
  some_arn = module.some_module.some_output
}

【讨论】:

  • 这不起作用,我仍然收到“这里不允许的变量”
  • 我认为这个答案不完整,因为在 .tfvars 文件中执行 foo = local.some_arn 时我仍然得到 variables not allowed here。
  • 应该提到你不能在你的 tfvars 中处理一个本地,而应该用 local.something 替换变量(此时你可以完全删除本地)
  • @MarcelloRomani 提到的文件是 variables.tf ,而不是 .tfvars。
【解决方案2】:

我遇到了同样的错误,但在我的例子中,我忘记在 terraform.tfvars 文件中将变量值括在引号 (" ") 中。

这在官方 terraform 存储库中被记录为问题: https://github.com/hashicorp/terraform/issues/24391

【讨论】:

    【解决方案3】:

    我发现有两件事可能导致您看到的错误。链接到terraform plandocumentation。

    1. 运行terraform plan时,会自动加载当前目录下的所有.tfvars文件。如果您的 .tfvars 文件位于另一个目录中,则必须将其作为 -var-file 参数提供。您在问题中说您的变量位于文件 variables.tf 中,这意味着 terraform plan 命令不会自动加载该文件。修复:将 variables.tf 重命名为 variables.tfvars

    2. 当使用-var 参数时,您应该确保您传递给它的内容将被 HCL 正确解释。如果您尝试传入的变量是一个映射,那么它需要能够解析为一个映射。

    而不是terraform plan -var 'MyAmi=xxxx',我希望它更像terraform plan -var 'MyAmi={"us-east-1":"ami-123", "us-east-2":"ami-456"}'。

    请参阅documentation,了解更多关于声明变量和通过命令行传递变量的信息。

    【讨论】:

    • 是的,是地图变量导致了问题。
    【解决方案4】:

    我有同样的问题,但我的问题是变量的默认值周围缺少引号

    variable "environment_name" {
      description = "Enter Environment name"
      default= test
    }
    

    这就是我解决这个问题的方法,

     variable "environment_name" {
          description = "Enter Environment name"
          default= "test"
        }
    

    【讨论】:

      【解决方案5】:

      检查 terraform 版本。 我有类似的东西,该模块是在 1.0 版上编写的,我使用的是 terraform 0.12 版。

      【讨论】:

        猜你喜欢
        • 2022-11-19
        • 2020-09-18
        • 2020-10-15
        • 2016-12-21
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        相关资源
        最近更新 更多