Terraform - 参数名称不能用引号引起来

Terraform - 参数名称不能用引号引起来

我正在使用 Terraform v0.12.6,在 vSphere 6.5 上部署 OpenShift 4.1 时遇到问题。当我运行 ./terraform apply、validate 或 plan 时,我得到了相同的响应:

Error: Invalid argument name

  on machine/main.tf line 47, in resource "vsphere_virtual_machine" "vm":
  47:       "guestinfo.ignition.config.data"          = "${base64encode(data.ignition_config.ign.*.rendered[count.index])}"

Argument names must not be quoted.

我尝试删除第 47 行的引号,但错误变成了其他内容。非常感谢您的帮助。

我正在使用来自以下 URL 的 main.tf 文件: https://github.com/openshift/installer/blob/master/upi/vsphere/machine/main.tf

答案1

这里的根本问题是,此配置未使用正确的参数语法properties。它是一个需要映射值而不是嵌套块的参数,因此必须这样写:

  vapp {
    properties = {
      "guestinfo.ignition.config.data"          = "${base64encode(data.ignition_config.ign.*.rendered[count.index])}"
      "guestinfo.ignition.config.data.encoding" = "base64"
    }
  }

通过分配properties映射值,而不是将其用作嵌套块,Terraform 可以看到这是一个映射表达式,因此知道带引号的映射键在这里是有效的。在嵌套块内,Terraform 需要参数名称,这些名称始终必须是有效的标识符(仅字母、数字、下划线和破折号)。

您提到的文件似乎是为 Terraform 0.11 编写的,因此可能存在其他需要针对 Terraform 0.12 进行一些更改的情况。如果这是您的模块,请考虑运行自动升级过程更新 Terraform 0.12 习语的语法并自动修复新 Terraform 0.12 语言语法中的许多细微差异。特别是,自动工具应该会自动检测并修复您在这个问题中遇到的问题。

相关内容