繁体   English   中英

使用 Terraform 检索 Azure VNET 子网 ID

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM