Terraform - 调用模块抛出错误时引用实例值
Terraform - reference instance value when calling module throwing errors
我有下面的代码块,它根据名称列表和 address_prefixes.
列表创建了一堆子网
resource "azurerm_subnet" "subnet" {
count = "${length(var.subnet_names)}"
name = "${element(var.subnet_names, count.index)}"
resource_group_name = "${var.vnet_rg_name}"
virtual_network_name = "${data.azurerm_virtual_network.vnet.name}"
address_prefix = "${element(var.subnet_prefixes, count.index)}"
service_endpoints = ["Microsoft.Sql","Microsoft.Storage","Microsoft.AzureCosmosDB"]
network_security_group_id = "${data.azurerm_network_security_group.required_nsg.id}"
route_table_id = "${element(azurerm_route_table.routetable.*.id, count.index)}"
depends_on = ["azurerm_route_table.routetable"]
}
然后我尝试使用模块创建一些路由,但是当我尝试使用来自 azurerm_subnet.subnet 资源的特定实例的属性为变量传递值时,它会抛出错误:
"module.insidedmzroutes.var.subnet_name: Resource 'azurerm_subnet.subnet' not found for variable 'azurerm_subnet.subnet.5.name'"
module "insidedmzroutes" {
source = "./modules/dmzroutes"
subnet_name = "${azurerm_subnet.subnet.5.name}"
vnet_rg = "${data.azurerm_resource_group.vnet_rg.name}"
route_table_name = "${azurerm_route_table.routetable.5.name}"
next_hop_ip = "${cidrhost(azurerm_subnet.subnet.5.address_prefix, 4)}"
subnet_names = ["${var.subnet_names}"]
subnet_prefixes = ["${var.subnet_prefixes}"]
}
这不起作用还是我的引用构造不正确?
请查看 Terraform interpolation syntax documentation,寻找 interpolation syntax
。
以下将起作用(如 Adil B 所示):
subnet_name = "${azurerm_subnet.subnet.*.name[5]}"
与 splat 语法一样 * 你 select 使用计数变量创建的所有元素,然后 return 一个列表,你可以 select 来自 [5] 的正确元素。
但是,为什么还要传递整个子网列表?这些是哪些子网?如果这些是您之前创建的 5 个子网或不同的子网,您的代码不是很清楚。您要为每个子网创建一个 insidedmzroutes
吗?如果是这样,我会摆脱 subnet_name
var,而是在模块内的资源中实现类似这样的东西:
count = "${length(var.subnet_names)}"
subnet_name = "${element(var.subnet_names, count.index)}"
我有下面的代码块,它根据名称列表和 address_prefixes.
列表创建了一堆子网resource "azurerm_subnet" "subnet" {
count = "${length(var.subnet_names)}"
name = "${element(var.subnet_names, count.index)}"
resource_group_name = "${var.vnet_rg_name}"
virtual_network_name = "${data.azurerm_virtual_network.vnet.name}"
address_prefix = "${element(var.subnet_prefixes, count.index)}"
service_endpoints = ["Microsoft.Sql","Microsoft.Storage","Microsoft.AzureCosmosDB"]
network_security_group_id = "${data.azurerm_network_security_group.required_nsg.id}"
route_table_id = "${element(azurerm_route_table.routetable.*.id, count.index)}"
depends_on = ["azurerm_route_table.routetable"]
}
然后我尝试使用模块创建一些路由,但是当我尝试使用来自 azurerm_subnet.subnet 资源的特定实例的属性为变量传递值时,它会抛出错误:
"module.insidedmzroutes.var.subnet_name: Resource 'azurerm_subnet.subnet' not found for variable 'azurerm_subnet.subnet.5.name'"
module "insidedmzroutes" {
source = "./modules/dmzroutes"
subnet_name = "${azurerm_subnet.subnet.5.name}"
vnet_rg = "${data.azurerm_resource_group.vnet_rg.name}"
route_table_name = "${azurerm_route_table.routetable.5.name}"
next_hop_ip = "${cidrhost(azurerm_subnet.subnet.5.address_prefix, 4)}"
subnet_names = ["${var.subnet_names}"]
subnet_prefixes = ["${var.subnet_prefixes}"]
}
这不起作用还是我的引用构造不正确?
请查看 Terraform interpolation syntax documentation,寻找 interpolation syntax
。
以下将起作用(如 Adil B 所示):
subnet_name = "${azurerm_subnet.subnet.*.name[5]}"
与 splat 语法一样 * 你 select 使用计数变量创建的所有元素,然后 return 一个列表,你可以 select 来自 [5] 的正确元素。
但是,为什么还要传递整个子网列表?这些是哪些子网?如果这些是您之前创建的 5 个子网或不同的子网,您的代码不是很清楚。您要为每个子网创建一个 insidedmzroutes
吗?如果是这样,我会摆脱 subnet_name
var,而是在模块内的资源中实现类似这样的东西:
count = "${length(var.subnet_names)}"
subnet_name = "${element(var.subnet_names, count.index)}"