微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将新创建的子网引用到 terraforn azure 中的另一个模块

如何解决如何将新创建的子网引用到 terraforn azure 中的另一个模块

我正在使用 terraform 在 Azure 上创建一个平台,并且通过使用 for_each 将变量传递给子网创建,我创建了一个 Vnet 和 2 个子网。现在我必须在我的整个平台中引用这两个子网,同时创建不同的模块,比如在 aks 集群或应用程序网关中。我如何将这两个子网(可能是我可以将变量更改为三个以便对其进行自定义)传递给其他模块以及如何引用它们,但标识我使用的子网与名称一样是一个不错的选择。

我的 main.tf 文件

resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet_name
  location            = var.location
  resource_group_name = var.resource_group_name
  address_space       = [var.vnet_address_space]

  tags = {
    environment   = "dev"
  }
}
resource "azurerm_subnet" "subnet" {
  for_each = {for subnet in var.subnets: subnet.prefix => subnet}
  name                  = each.value.name
  address_prefixes      = [each.value.prefix]
  resource_group_name   = var.resource_group_name
  virtual_network_name  = azurerm_virtual_network.vnet.name  
}

变量定义如下。

resource_group_name ="Dev"
location ="South Central US"
vnet_name ="vnet"
vnet_address_space ="10.16.0.0/12"

subnets = [{
        name ="DMZ"
        prefix ="10.16.0.0/16"
    },{
        name ="Internal"
        prefix ="10.17.0.0/16"
    }
]

解决方法

在其他模块中使用之前创建的子网有两个条件。

首先,如果您只是将您在根级别提供的代码与其他模块一起使用,我假设您想使用 aks 模块中的子网:

variable "vnet_name" {}

variable "resource_group_name" {}

variable "vnet_address_space" {}

variable "location" {}

variable "subnets" {}

resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet_name
  location            = var.location
  resource_group_name = var.resource_group_name
  address_space       = [var.vnet_address_space]

  tags = {
    environment   = "dev"
  }
}

resource "azurerm_subnet" "subnet" {
  for_each = {for subnet in var.subnets: subnet.prefix => subnet}
  name                  = each.value.name
  address_prefixes      = [each.value.prefix]
  resource_group_name   = var.resource_group_name
  virtual_network_name  = azurerm_virtual_network.vnet.name  
}

module "aks" {
  source = "./modules/aks"

  DMZ_subnet = azurerm_subnet.subnet["DMZ"]
  Internal_subnet = azurerm_subnet.subnet["Internal"]

  ...
}

其次,如果你把网络代码放在一个模块中,而你想使用其他模块中的子网,那么你需要在网络模块中定义输出并在其他模块中使用输出:

./modules/vnet/main.tf

variable "vnet_name" {}

variable "resource_group_name" {}

variable "vnet_address_space" {}

variable "location" {}

variable "subnets" {}

resource "azurerm_virtual_network" "vnet" {
  name                = var.vnet_name
  location            = var.location
  resource_group_name = var.resource_group_name
  address_space       = [var.vnet_address_space]

  tags = {
    environment   = "dev"
  }
}

resource "azurerm_subnet" "subnet" {
  for_each = {for subnet in var.subnets: subnet.prefix => subnet}
  name                  = each.value.name
  address_prefixes      = [each.value.prefix]
  resource_group_name   = var.resource_group_name
  virtual_network_name  = azurerm_virtual_network.vnet.name  
}

output "subnets" {
  value = azurerm_subnets.subnet
}

main.tf

module "network" {
  source = "./modules/network"
  ...
}

module "aks" {
  source = "./modules/aks"

  DMZ_subnet = module.network.subnets["DMZ"]
  Internal_subnet = module.network.subnets["Internal"]

  ...
}

更新:

上面的代码使用子网名称来引用子网,所以需要把azurerm_subnet中的for_each改成下面这个,我也推荐这个:

for_each = {for subnet in var.subnets: subnet.name => subnet}

使用您的原始代码:

for_each = {for subnet in var.subnets: subnet.prefix=> subnet}

您需要使用子网前缀来引用子网,例如

DMZ_subnet = azurerm_subnet.subnet["10.16.0.0/16"]

子网的输出如下:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。