You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 regels
6.1 KiB

  1. terraform {
  2. required_version = "~> 0.12.21"
  3. required_providers {
  4. azurerm = "~> 1.44"
  5. }
  6. }
  7. resource "azurerm_lb" "azlb" {
  8. for_each = var.lbs
  9. name = each.key
  10. resource_group_name = each.value.resource_group_name
  11. location = each.value.location
  12. tags = each.value.tags
  13. sku = try(each.value.sku, "Basic") #Basic or Standard
  14. dynamic "frontend_ip_configuration" {
  15. for_each = try(each.value.frontend_ip_configurations, {})
  16. content {
  17. name = try(frontend_ip_configuration.value.name, join("-ipc", [each.key, index(each.value.frontend_ip_configurations, frontend_ip_configuration)]))
  18. subnet_id = data.azurerm_subnet.sub[frontend_ip_configuration.value.name].id
  19. private_ip_address_allocation = try(frontend_ip_configuration.value.private_ip_address_allocation, "Static") #Static or Dynamic
  20. private_ip_address = try(frontend_ip_configuration.value.private_ip_address_allocation, "Static") == "Static" ? frontend_ip_configuration.value.private_ip_address : null
  21. public_ip_address_id = try(frontend_ip_configuration.value.public_ip_address_id, null)
  22. public_ip_prefix_id = try(frontend_ip_configuration.value.public_ip_prefix_id, null)
  23. zones = try(frontend_ip_configuration.value.zones, null)
  24. }
  25. }
  26. depends_on = [var.azlb_depends_on]
  27. }
  28. locals {
  29. fipcs = flatten([
  30. for lbkey, lb in var.lbs : [
  31. for fipc in try(lb.frontend_ip_configurations, []) : {
  32. name = fipc.name
  33. rules = try(fipc.rules, [])
  34. lb_name = lbkey
  35. resource_group_name = lb.resource_group_name
  36. subnet = {
  37. name = fipc.subnet.name
  38. virtual_network_name = fipc.subnet.virtual_network_name
  39. resource_group_name = try(fipc.subnet.resource_group_name, lb.resource_group_name)
  40. }
  41. }
  42. ]
  43. ])
  44. }
  45. data "azurerm_subnet" "sub" {
  46. for_each = {for fipc in local.fipcs: fipc.name => fipc}
  47. name = each.value.subnet.name
  48. virtual_network_name = each.value.subnet.virtual_network_name
  49. resource_group_name = each.value.subnet.resource_group_name
  50. depends_on = [var.azlb_depends_on]
  51. }
  52. locals {
  53. bps = flatten([
  54. for lbkey, lb in var.lbs : [
  55. for bp in try(lb.backend_pools, []) : {
  56. name = bp.name
  57. resource_group_name = lb.resource_group_name
  58. lb_name = lbkey
  59. nics = bp.nics
  60. }
  61. ]
  62. ])
  63. }
  64. resource "azurerm_lb_backend_address_pool" "azlbbpool" {
  65. for_each = {for bp in local.bps: bp.name => bp}
  66. name = each.key
  67. resource_group_name = each.value.resource_group_name
  68. loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id
  69. }
  70. locals {
  71. rules = flatten([
  72. for fipc in local.fipcs : [
  73. for rule in fipc.rules : {
  74. name = rule.name
  75. resource_group_name = fipc.resource_group_name
  76. lb_name = fipc.lb_name
  77. fipc_name = fipc.name
  78. protocol = rule.protocol # Tcp, Udp or All
  79. frontend_port = rule.frontend_port
  80. backend_port = rule.backend_port
  81. backend_pool_name = rule.backend_pool_name
  82. load_distribution = rule.load_distribution # 'Default', SourceIP, SourceIPProtocol
  83. probe = rule.probe
  84. }
  85. ]
  86. ])
  87. }
  88. locals {
  89. probes = flatten([
  90. for rule in local.rules : {
  91. name = rule.probe.name
  92. resource_group_name = rule.resource_group_name
  93. lb_name = rule.lb_name
  94. protocol = rule.probe.protocol # Tcp, Http or Https
  95. port = try(rule.probe.port, rule.backend_port)
  96. request_path = try(rule.probe.request_path, null)
  97. }
  98. ])
  99. }
  100. resource "azurerm_lb_probe" "azlbprobe" {
  101. for_each = {for probe in local.probes: probe.name => probe}
  102. name = each.key
  103. resource_group_name = each.value.resource_group_name
  104. loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id
  105. protocol = each.value.protocol
  106. port = each.value.port
  107. request_path = try(each.value.request_path, null)
  108. }
  109. resource "azurerm_lb_rule" "azlbrule" {
  110. for_each = {for rule in local.rules: rule.name => rule}
  111. name = each.key
  112. resource_group_name = each.value.resource_group_name
  113. loadbalancer_id = azurerm_lb.azlb[each.value.lb_name].id
  114. frontend_ip_configuration_name = each.value.fipc_name
  115. protocol = each.value.protocol
  116. backend_address_pool_id = azurerm_lb_backend_address_pool.azlbbpool[each.value.backend_pool_name].id
  117. frontend_port = each.value.frontend_port
  118. backend_port = each.value.backend_port
  119. load_distribution = each.value.load_distribution
  120. probe_id = azurerm_lb_probe.azlbprobe[each.value.probe.name].id
  121. # depends_on = [azurerm_marketplace_agreement.accept]
  122. }
  123. locals {
  124. nics = flatten([
  125. for bp in local.bps : [
  126. for nic in bp.nics : {
  127. name = nic.name
  128. resource_group_name = nic.resource_group_name
  129. lb_name = bp.lb_name
  130. ipc_name = nic.ipc_name
  131. bp_name = bp.name
  132. }
  133. ]
  134. ])
  135. }
  136. data "azurerm_network_interface" "nic" {
  137. for_each = {for nic in local.nics: nic.name => nic}
  138. name = each.key
  139. resource_group_name = each.value.resource_group_name
  140. depends_on = [var.azlb_depends_on]
  141. }
  142. resource "azurerm_network_interface_backend_address_pool_association" "aznicbpass" {
  143. for_each = {for nic in local.nics: nic.name => nic}
  144. network_interface_id = data.azurerm_network_interface.nic[each.key].id
  145. ip_configuration_name = each.value.ipc_name
  146. backend_address_pool_id = azurerm_lb_backend_address_pool.azlbbpool[each.value.bp_name].id
  147. }