一个表达式被成功解析,但在它之后发现了额外的字符

An expression was successfully parsed, but extra characters were found after it

我有一个 "create_vm" 模块,它正在创建 VM 加上存储帐户、NIC 等

我的要求是我想将 IP 地址列表从根模块传递到 create_vm 模块,这样任何人都可以根据他们的要求限制与 VM 的绑定连接。纠正我,我没有使用正确的模块术语。

目录结构如下所示:

subscription_1  subscription_2  Modules  README.md  

./subscription_1:

./subscription_2:
main.tf  sqlvm.tf.bak  terraform.tfstate  terraform.tfstate.backup  variables.tf

./Modules:
create_vm

./Modules/create_vm:
main.tf  variable.tf

猫./Modules/create_vm/main.tf

resource "azurerm_network_security_rule" "tf-nsr-5986" {
...
  source_address_prefixes     = "${var.allowed_source_ips}"
...
}

猫./Modules/create_vm/variable.tf

variable "allowed_source_ips" {
  description = "List of ips from which inbound connection to VMs is allowed"
  type        = "list"
}

在根模块中使用它 猫./subscription_2/main.tf

module "vm_app" {
...
  allowed_source_ips  = "${var.ip_list}"
...
}

猫./subscription_2/variable.tf

variable "ip_list" {
  description = "List of ips from which inbound connection to VMs is allowed"
  type        = "list"
}

现在,我是 运行 来自本地虚拟机的 terraform,通过传递参数,这与我在 Azure DevOps 管道上的方式完全一样

terraform plan -var "resource_group_name=nxt-grp-prd-manage-rgp-au-se" -var "virtual_network_name=virtual_network_1" -var "sql_subnet_name=subnet_1" -var "app_subnet_name=subnet_2" -var "application_nsg=test_nsg" -var "count_vm=2" -var "sql_host_basename=sqlvms" -var "app_host_basename=appvms" -var "storage_account_suffix=sta" -var "virtual_machine_size=Standard_B1ms" -var "virtual_machine_image_publisher=MicrosoftWindowsServer" -var "virtual_machine_image_offer=WindowsServer" -var "virtual_machine_image_sku=2012-R2-Datacenter" -var "virtual_machine_image_version=latest" -var "username=devopsadmin" -var "password=Angular12#$%" -var "ip_list="a.b.c.d","p.q.r.s","x.y.z.l""

不幸的是,我收到如下错误消息:

Error: Invalid number literal

  on <value for var.ip_list> line 1:
  (source code not available)

Failed to recognize the value of this number literal.


Error: Extra characters after expression

  on <value for var.ip_list> line 1:
  (source code not available)

An expression was successfully parsed, but extra characters were found after
it.

以前有人解决过这类挑战吗?不太确定为什么会抱怨,我给出的方式与之前在 create_vm 模块中给出的方式相同。

如有任何帮助,我们将不胜感激。

您应该将列表分配给 ip_list 变量,而不是字符串。您期待一个列表,但您分配的是一个字符串(这在技术上很好,它被解析为一个包含单个字符串的列表。)然后是一个逗号,这是额外的字符。

相反,您应该传递一个适当的列表作为参数,注意 'array' / [](方括号)符号。

 ... -var "ip_list=["a.b.c.d","p.q.r.s","x.y.z.l"] ...

我也强烈建议您改用可变文件。然后您将获得一些 linting/terraform 语言支持。这将使您在 运行 tf apply in ci/cd.

之前更容易发现错误

您将创建一个文件 variables.tfvars:

...
variable "ip_list" {
  description = "List of ips ..."
  default     = ["a.b.c.d","p.q.r.s","x.y.z.l"]
}
...

然后您可以将整个文件作为参数传递给 terraform apply -var-file="./variables.tfvars"

查找输入变量与实际发送的变量之间的类型不匹配。

这是一个普遍的错误,当输入的类型是映射或列表并且给出了字符串时,它往往会出现。我相信这与 Terraform 尝试将输入转换为输入变量中设置的内容的方式有关。

示例:
在名为 test

的模块中的 variables.tf 中给出以下内容
variable "foo" {
  type = map
}

如果你像这样实例化你的模块:

module "example" {
  source = "./test"
  foo = <<-EOT
  bar
  EOT
}

此错误将会出现。

在大多数情况下,Terraform 试图阻止这种情况,但有些事情会被忽略(例如 heredoc 语法)。