locals { server_volumes = flatten([ for server_key, server in var.server : [ for volume_key, volume in try(server.volumes, []) : { volume_name = volume.name volume_size = volume.size server_id = hcloud_server.server[server.name].id server_name = server.name } ] ]) } locals { server_domains = flatten([ for server_key, server in var.server : [ for domain_key, domain in try(server.domains, []) : { record_id = try(domain.id, domain.name) record_name = domain.name record_type = domain.type record_value = domain.value record_ttl = try(domain.ttl, 1) zone_id = var.cloudflare_zones[try(domain.zone_name, var.server_dns_zone)] } ] ]) } resource "hcloud_server" "server" { for_each = { for row in var.server : row.name => row } depends_on = [hcloud_ssh_key.key] name = "${each.value.name}.${try(each.value.dns_zone, var.server_dns_zone)}" server_type = each.value.server_type image = each.value.image datacenter = each.value.datacenter ssh_keys = var.server_keys backups = try(each.value.backups, false) keep_disk = try(each.value.keep_disk, false) user_data = try(each.value.user_data, null) placement_group_id = each.value.placement_group lifecycle { ignore_changes = [ ssh_keys, image, ] } labels = merge( { provisioner = "terraform" project = var.hcloud_project os = each.value.os zone = each.value.zone }, { for index, service in try(each.value.services, []) : "service_${index + 1}" => service }, { for index, type in try(each.value.types, []) : "type_${index + 1}" => type }, try(each.value.labels, {}) ) } resource "hcloud_volume" "volume" { for_each = { for row in local.server_volumes : row.volume_name => row } name = each.value.volume_name size = each.value.volume_size server_id = each.value.server_id labels = merge( { provisioner = "terraform" project = var.hcloud_project server = each.value.server_name }, try(each.value.labels, {}) ) } resource "hcloud_ssh_key" "key" { for_each = { for row in toset(var.hcloud_ssh_keys) : element(split(" ", row), 2) => row } name = each.key public_key = "${element(split(" ", each.value), 0)} ${element(split(" ", each.value), 1)}" } resource "hcloud_server_network" "subnets" { for_each = { for row in var.server : row.name => row if contains(keys(row), "subnet") } server_id = hcloud_server.server[each.value.name].id subnet_id = each.value.subnet ip = each.value.subnet_ip } resource "hcloud_rdns" "serverv4" { for_each = { for row in var.server : row.name => row } server_id = hcloud_server.server[each.value.name].id ip_address = hcloud_server.server[each.value.name].ipv4_address dns_ptr = "${each.value.name}.${try(each.value.dns_zone, var.server_dns_zone)}" } resource "hcloud_rdns" "serverv6" { for_each = { for row in var.server : row.name => row } server_id = hcloud_server.server[each.value.name].id ip_address = hcloud_server.server[each.value.name].ipv6_address dns_ptr = "${each.value.name}.${try(each.value.dns_zone, var.server_dns_zone)}" } resource "cloudflare_record" "serverv4" { for_each = { for row in var.server : row.name => row } zone_id = var.cloudflare_zones[try(each.value.dns_zone, var.server_dns_zone)] name = each.value.name value = hcloud_server.server[each.value.name].ipv4_address type = "A" ttl = 1 } resource "cloudflare_record" "serverv6" { for_each = { for row in var.server : row.name => row } zone_id = var.cloudflare_zones[try(each.value.dns_zone, var.server_dns_zone)] name = each.value.name value = hcloud_server.server[each.value.name].ipv6_address type = "AAAA" ttl = 1 } resource "cloudflare_record" "record" { for_each = { for row in local.server_domains : row.record_id => row } zone_id = each.value.zone_id name = each.value.record_name value = each.value.record_value type = each.value.record_type ttl = each.value.record_ttl } resource "restapi_object" "ucs_server" { for_each = { for row in var.server : row.name => row } path = "/dns/host_record/" data = jsonencode({ "position" : var.ucs_zones[try(each.value.dns_zone, var.server_dns_zone)], "properties" : { "name" : each.value.name, "a" : [ hcloud_server.server[each.value.name].ipv4_address, try(each.value.ucs_ipv6_address, hcloud_server.server[each.value.name].ipv6_address), ], } }) }