94 lines
3.7 KiB
HCL
94 lines
3.7 KiB
HCL
# main.tf
|
|
|
|
# --------------------------------------------------------------------------------------------------
|
|
# LOCAL VARIABLES
|
|
# --------------------------------------------------------------------------------------------------
|
|
|
|
locals {
|
|
# Create a map of zones to be created (where zone_id is not specified)
|
|
zones_to_create = { for k, v in var.zones : k => v if try(v.zone_id, null) == null }
|
|
|
|
# Create a map of zones to be referenced via data source (where zone_id is specified)
|
|
zones_to_read = { for k, v in var.zones : k => v if try(v.zone_id, null) != null }
|
|
|
|
# Merge the created resources and data sources into a single, unified map.
|
|
# This allows record sets to reference a zone regardless of whether it was created or read.
|
|
all_zones = merge(
|
|
{
|
|
for k, zone in stackit_dns_zone.this : k => zone
|
|
},
|
|
{
|
|
for k, zone in data.stackit_dns_zone.this : k => zone
|
|
}
|
|
)
|
|
|
|
# Flatten the nested record_sets structure into a single list, making it easy to iterate with for_each.
|
|
# Each item in the list retains a reference to its parent zone key.
|
|
flat_record_sets = flatten([
|
|
for zone_key, zone_config in var.zones : [
|
|
for record_key, record_config in try(zone_config.record_sets, {}) : {
|
|
zone_key = zone_key
|
|
record_key = record_key
|
|
name = record_config.name
|
|
type = record_config.type
|
|
records = record_config.records
|
|
ttl = try(record_config.ttl, null)
|
|
comment = try(record_config.comment, null)
|
|
active = try(record_config.active, null)
|
|
}
|
|
]
|
|
])
|
|
}
|
|
|
|
# --------------------------------------------------------------------------------------------------
|
|
# DNS ZONE RESOURCES (CREATE OR READ)
|
|
# --------------------------------------------------------------------------------------------------
|
|
|
|
# Create new DNS zones for configurations that do not have a zone_id
|
|
resource "stackit_dns_zone" "this" {
|
|
for_each = local.zones_to_create
|
|
|
|
project_id = var.project_id
|
|
name = each.value.name
|
|
dns_name = each.value.dns_name
|
|
contact_email = try(each.value.contact_email, null)
|
|
description = try(each.value.description, null)
|
|
acl = try(each.value.acl, null)
|
|
active = try(each.value.active, null)
|
|
default_ttl = try(each.value.default_ttl, null)
|
|
expire_time = try(each.value.expire_time, null)
|
|
is_reverse_zone = try(each.value.is_reverse_zone, null)
|
|
negative_cache = try(each.value.negative_cache, null)
|
|
primaries = try(each.value.primaries, null)
|
|
refresh_time = try(each.value.refresh_time, null)
|
|
retry_time = try(each.value.retry_time, null)
|
|
type = try(each.value.type, "primary")
|
|
}
|
|
|
|
# Read existing DNS zones for configurations that provide a zone_id
|
|
data "stackit_dns_zone" "this" {
|
|
for_each = local.zones_to_read
|
|
|
|
project_id = var.project_id
|
|
zone_id = each.value.zone_id
|
|
}
|
|
|
|
# --------------------------------------------------------------------------------------------------
|
|
# DNS RECORD SET RESOURCES
|
|
# --------------------------------------------------------------------------------------------------
|
|
|
|
resource "stackit_dns_record_set" "this" {
|
|
# The key is a unique combination of the zone and record keys for a stable address.
|
|
for_each = { for record in local.flat_record_sets : "${record.zone_key}.${record.record_key}" => record }
|
|
|
|
project_id = var.project_id
|
|
# Look up the correct zone_id from the unified 'all_zones' map
|
|
zone_id = local.all_zones[each.value.zone_key].zone_id
|
|
|
|
name = each.value.name
|
|
type = each.value.type
|
|
records = each.value.records
|
|
ttl = each.value.ttl
|
|
comment = each.value.comment
|
|
active = each.value.active
|
|
}
|