gpt4 book ai didi

azure - Terraform NSG 使用 for_each 从多个模块输出规则

转载 作者:行者123 更新时间:2023-12-04 11:43:53 24 4
gpt4 key购买 nike

正在寻找有关我面临的以下问题的指导...

我们在 .tfvars 中定义映射,使用 for_each 引用这些映射来部署我们的模块。这已经运行了一段时间了......但是,我们最近部署了一个集群环境。因此,我们现在有两个应用程序服务器,在 .tfvars 中定义:

tfvars 中的 app_servers 映射:

app_servers = {
sr-app-1 = {
size = "Standard_E2s_v3"
admin_username = "azureuser"
data_disks = [64]
zone_vm = "1"
zone_disk = ["1"]
os_disk_size = 64
web_server = "sr-web-1"
},
sr-app-2 = {
size = "Standard_E2s_v3"
admin_username = "azureuser"
data_disks = [64]
zone_vm = "1"
zone_disk = ["1"]
os_disk_size = 64
web_server = "sr-web-2"
}
}

tfvars 中的 db_servers 映射

db_servers = {
sr-fdb-1 = {
size = "Standard_D4s_v3"
admin_user = "azureuser"
data_disks = [64, 64, 128]
zone_vm = "1"
zone_disk = ["1"]
os_disk_size = 128
app_server = "sr-app-1"
etl_server = "sr-etl-1"
}
sr-sdb-1 = {
size = "Standard_D4s_v3"
admin_user = "azureuser"
data_disks = [64, 64, 128]
zone_vm = "1"
zone_disk = ["1"]
os_disk_size = 128
app_server = "sr-app-1"
etl_server = "sr-etl-1"
}
}

我们使用 outputs.tf 填充 NSG 规则的 source_address_prefixes(在模块外部,在 main.tf 中)来自底层 linux_vm 模块。由于我们在 db_servers 映射(如下)上使用 for_each,因此我们无法访问 app_servers 映射。因此,我们向 db_servers 映射添加了一个键,以标识为每个 app_servers 运行的特定模块(请参见上面的 db_servers 映射):

outputs.tf(在 linux_vm 模块内):

output "linux_vm_ip" {
value = azurerm_network_interface.uks_network_interface.private_ip_address
}

output "linux_vm_nsg" {
value = azurerm_network_security_group.uks_network_security_group.name
}

main.tf:

module "fico_db_vm" {
for_each = var.db_servers
source = "../modules/compute/windows_vm"
source_image_id = var.db_image_id
vm_name = each.key
vm = each.value
subnet_name = "back-end-01"
resource_group = azurerm_resource_group.rg_uks_fico_db.name
data_disks = each.value["data_disks"]
enable_management_locks = true
}
resource "azurerm_network_security_rule" "fico-db-sr-1433" {
for_each = var.db_servers
name = "nsr-${var.location}-${var.environment}-${var.directorate}-${var.business_unit}-sql"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "*"
source_port_range = "*"
destination_port_range = "1433"
source_address_prefixes = [module.fico_app_vm[each.value.app_server].linux_vm_ip, module.fico_etl_vm[each.value.etl_server].windows_vm_ip]
destination_address_prefix = "VirtualNetwork"
resource_group_name = azurerm_resource_group.rg_uks_fico_db.name
network_security_group_name = module.fico_db_vm[each.key].windows_vm_nsg
}

这在我们的 SBOX/DEV 环境中运行良好,这些环境都是单实例 - 但是,我们现在已经将集群应用程序部署到我们的测试环境中。我无法找到将辅助应用程序服务器 IP 添加到上述 NSG 规则的好方法。

最初,我尝试向 db_servers 映射添加一个新 key (app_server2),以便可以以相同的方式引用:source_address_prefixes = [module.fico_app_vm[each.value.app_server].linux_vm_ip, module.fico_app_vm[each.value.app_server2].linux_vm_ip, module.fico_etl_vm[each.value.etl_server].windows_vm_ip]

它在 TEST 中按预期工作,但这并不可行,因为在我们现有的 SBOX/DEV 环境中运行相同的代码时,Terraform 计划会提示 app_server2 未定义...

我尝试将 app_server2 添加到 SBOX/DEV tfvars 作为“null”或只是一个空值,但这也提示因为 map 不能为空/null?

也许我在兔子洞里太远了,看不到明显的解决方案,任何建议/指导将不胜感激。

最佳答案

我最终通过删除我的 map 中对其他 map 的引用来解决这个特定问题......

相反,我在 main.tf 中添加了一些局部变量

locals {
app_vm_ips = [
for key, val in module.fico_app_vm :
module.fico_app_vm[key].linux_vm_ip
]
web_vm_ips = [
for key, val in module.fico_web_vm :
module.fico_web_vm[key].linux_vm_ip
]
etl_vm_ips = [
for key, val in module.fico_etl_vm :
module.fico_etl_vm[key].windows_vm_ip
]
}

然后,我在 azurerm_network_security_group_rule 资源中使用这些局部变量,如下所示:

resource "azurerm_network_security_rule" "fico-db-sr-1433" {
for_each = var.db_servers
name = "nsr-${var.location}-${var.environment}-${var.directorate}-${var.business_unit}-sql"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "*"
source_port_range = "*"
destination_port_range = "1433"
source_address_prefixes = concat(local.app_vm_ips, local.etl_vm_ips)
destination_address_prefix = "VirtualNetwork"
resource_group_name = azurerm_resource_group.rg_uks_fico_db.name
network_security_group_name = module.fico_db_vm[each.key].windows_vm_nsg
}

关于azure - Terraform NSG 使用 for_each 从多个模块输出规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67908112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com