一个表达式被成功解析,但在它之后发现了额外的字符
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 语法)。
我有一个 "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 语法)。