[英]Terraform NSG rules from multiple module outputs with for_each
尋找一些關於我面臨的以下問題的指導......
我們在 our.tfvars 中定義映射,使用 for_each 引用這些映射來部署我們的模塊。 這已經有一段時間了……但是,我們最近部署了一個集群環境。 所以,我們現在有兩個應用服務器,定義在 .tfvars 中:
tfvars 中的 app_servers map:
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 map
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
模塊的source_address_prefixes
填充我們的 NSG 規則的 source_address_prefixes(在模塊外部,在main.tf
中)。 因為我們在db_servers
map(如下)上使用了for_each
,所以我們無法訪問app_servers
map。 因此,我們向db_servers
map 添加了一個鍵,以識別為每個app_servers
運行的特定模塊(參見上面的db_servers
映射):
output.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
}
主文件:
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 環境中運行良好 - 但是,我們現在已將集群應用程序部署到我們的 TEST 環境中。 我想不出將輔助應用服務器 IP 添加到上述 NSG 規則的好方法。
最初我嘗試向 db_servers map 添加一個新密鑰 (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]
它在測試中按預期工作,但這不可行,因為 Terraform 計划在我們現有的 SBOX/DEV 環境中運行相同的代碼時抱怨app_server2
未定義...
我試圖將app_server2
添加到 SBOX/DEV tfvars 作為“null”或只是一個空值,但這也抱怨,因為似乎地圖不能為空/null?
也許我離兔子洞太遠了,看不到明顯的解決方案,任何建議/指導都將不勝感激。
我最終通過在我的地圖中刪除對其他地圖的引用來解決這個特殊問題......
相反,我在 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.