hcloud-server-tf/main.tf

159 lines
4.7 KiB
HCL

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 = try(each.value.placement_group, null)
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),
],
}
})
}