[英]Terraform Azure Provision VM to existing subnet/vnet/resourcegroup
[英]Retrieve Azure VNET subnet IDs with Terraform
我想使用azurerm_virtual_network数据源从 Azure 中的现有 VNET 检索/拉取子网 ID。 我下面的代码没有按预期工作。 任何帮助表示赞赏。
data "azurerm_virtual_network" "vnet" {
name = "my-vnet"
resource_group_name = "my-resource-group"
}
output "my-subnets-ids" {
value = "${data.azurerm_virtual_network.vnet.subnets.id}"
}
我在执行时收到以下错误。
output.my-subnets: Resource 'data.azurerm_virtual_network.vnet'
does not have attribute 'subnets.id' for variable
'data.azurerm_virtual_network.vnet.subnets.id'
我会将它与 子网数据资源结合起来,并使用它来获取您的所有 ID。 这段代码很接近,我没有时间把它拉出来并计算出完整的语法。
data "azurerm_subnet" "test" {
name = "${data.azurerm_virtual_network.vnet.subnets[count.index]}"
virtual_network_name = "${data.azurerm_virtual_network.vnet.name}"
resource_group_name = "${data.azurerm_virtual_network.vnet.resource_group_name"
count = "${count(data.azurerm_virtual_network.vnet.subnets)}"
}
output "subnet_ids" {
value = "${data.azurerm_subnet.test.*.id}"
}
根据本它只包含子网的名称,而不是他们的ID列表,所以你需要将这些手动构造。 最简单的方法 - 获取 vnet.id 并添加'/subnets/${each subnet name goes here}'
subnets '/subnets/${each subnet name goes here}'
您可以通过以下方式获取:
data.azurerm_virtual_network.vnet.subnet.*.id
这将是一个列表,要获得第一个成员,请使用:
data.azurerm_virtual_network.virtualNetwork1.subnet.*.id[0]
我已经根据 Jamies 提出的解决方案实现了这一点,并且此代码有效:)
data "azurerm_subnet" "virtualSubnets1" {
name = data.azurerm_virtual_network.virtualNetwork1.subnets[count.index]
virtual_network_name = data.azurerm_virtual_network.virtualNetwork1.name
resource_group_name = data.azurerm_virtual_network.virtualNetwork1.resource_group_name
count = length(data.azurerm_virtual_network.virtualNetwork1.subnets)
}
output "virtualnetwork_subnets_ids" {
value = data.azurerm_subnet.virtualSubnets1.*.id
}
...然后你可以使用这样的东西检索子网
resource "azurerm_subnet_network_security_group_association" "nsg_mapping1" {
subnet_id = data.terraform_remote_state.networking.outputs.virtualnetwork_subnets_ids[1]
network_security_group_id = azurerm_network_security_group.nsg.id
}
如果您希望能够使用子网名称而不是任意索引来引用结果,您可以使用以下内容。
data "azurerm_virtual_network" "vnet_ski_01" {
name = module.vnet_ski_01.name
resource_group_name = module.azurerm_resource_group_net_01.name
}
data "azurerm_subnet" "vnet_ski_01_subnets" {
for_each = toset(data.azurerm_virtual_network.vnet_ski_01.subnets)
name = each.value
virtual_network_name = "${data.azurerm_virtual_network.vnet_ski_01.name}"
resource_group_name = "${data.azurerm_virtual_network.vnet_ski_01.resource_group_name}"
}
然后,您可以按名称引用您的子网,例如(AzureBastionSubnet 是子网名称)
output "subnet_bastion_address_space" {
value = data.azurerm_subnet.vnet_ski_01_subnets["AzureBastionSubnet"].address_prefix
}
我使用这种方法将所有子网传递到 NSG 模块中,以便我可以在 NSG 规则中引用子网地址空间
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.