如何解决如何将新创建的子网引用到 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"]
子网的输出如下:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。