【问题标题】:Retrieve Azure VNET subnet IDs with Terraform使用 Terraform 检索 Azure VNET 子网 ID
【发布时间】:2021-11-26 08:54:44
【问题描述】:

我想使用 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'

【问题讨论】:

    标签: azure terraform


    【解决方案1】:

    我会将它与subnet 数据资源结合起来,并使用它来获取您的所有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}"
     }
    

    【讨论】:

    • 这有点作用,但没有多大意义,因为每个子网都需要一个 DATA 块,更容易使用现有的 vnet 数据块
    • 您不必为每个子网添加数据块,因为我使用计数和插值来获取它。它确实很臭。
    • 杰米是对的。这将拉取 VNET 中的所有子网,而不需要每个子网都有一个数据块。很干净。谢谢!
    【解决方案2】:

    如果您希望能够使用子网名称而不是任意索引来引用结果,您可以使用以下内容:

    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 规则中引用子网地址空间

    【讨论】:

      【解决方案3】:

      根据this,它只包含子网名称列表,而不是它们的 ID,因此您需要手动构建它们。最简单的方法 - 获取 vnet.id 并添加 '/subnets/${each subnet name goes here}'

      【讨论】:

        【解决方案4】:

        您可以通过以下方式获得它:

        data.azurerm_virtual_network.vnet.subnet.*.id
        

        这将是一个列表,要获取第一个成员,请使用:

        data.azurerm_virtual_network.virtualNetwork1.subnet.*.id[0]
        

        【讨论】:

          【解决方案5】:

          我已经根据 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
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-03-01
            • 2022-07-06
            • 2021-11-08
            • 1970-01-01
            • 2021-03-13
            • 2021-03-11
            • 2020-05-26
            相关资源
            最近更新 更多