|
@@ -0,0 +1,138 @@ |
|
|
|
|
|
# Provider Setup |
|
|
|
|
|
|
|
|
|
|
|
variable "hetzner_token" { |
|
|
|
|
|
type = string |
|
|
|
|
|
description = "Hetzner Cloud API-Token" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
variable "hetzner_default_location" { |
|
|
|
|
|
type = string |
|
|
|
|
|
default = "nbg1" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
variable "hetzner_server_image" { |
|
|
|
|
|
type = string |
|
|
|
|
|
default = "debian-10" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
variable "hetzner_default_server_type" { |
|
|
|
|
|
type = string |
|
|
|
|
|
default = "cx11" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
variable "hetzner_ssh_keys_filenames" { |
|
|
|
|
|
type = set(string) |
|
|
|
|
|
default = [ |
|
|
|
|
|
"~/.ssh/id_ed25519.pub", |
|
|
|
|
|
] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
provider "hcloud" { |
|
|
|
|
|
token = var.hetzner_token |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Network |
|
|
|
|
|
|
|
|
|
|
|
#resource "hcloud_network" "internal_network" { |
|
|
|
|
|
# name = "internal_network" |
|
|
|
|
|
# ip_range = "10.0.0.0/8" |
|
|
|
|
|
#} |
|
|
|
|
|
#resource "hcloud_network_subnet" "internal_network" { |
|
|
|
|
|
# network_id = hcloud_network.internal_network.id |
|
|
|
|
|
# type = "server" |
|
|
|
|
|
# network_zone = "eu-central" |
|
|
|
|
|
# ip_range = "10.9.0.0/16" |
|
|
|
|
|
#} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# VMs |
|
|
|
|
|
|
|
|
|
|
|
resource "hcloud_ssh_key" "ssh_keys" { |
|
|
|
|
|
name = each.value |
|
|
|
|
|
public_key = file(each.value) |
|
|
|
|
|
for_each = var.hetzner_ssh_keys_filenames |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
locals { |
|
|
|
|
|
hetzner_vm_hosts = { |
|
|
|
|
|
for hostname, host in var.vm_hosts: hostname => host |
|
|
|
|
|
if host.provider == "hetzner" |
|
|
|
|
|
} |
|
|
|
|
|
hetzner_vm_hosts_with_groups = { |
|
|
|
|
|
for hostname, host in local.hetzner_vm_hosts: hostname => host if contains(keys(host),"groups") |
|
|
|
|
|
} |
|
|
|
|
|
hetzner_vm_hosts_without_groups = { |
|
|
|
|
|
for hostname, host in local.hetzner_vm_hosts: hostname => host if !contains(keys(host),"groups") |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resource "hcloud_server" "vms" { |
|
|
|
|
|
name = each.key |
|
|
|
|
|
image = var.hetzner_server_image |
|
|
|
|
|
server_type = var.hetzner_default_server_type |
|
|
|
|
|
location = var.hetzner_default_location |
|
|
|
|
|
ssh_keys = [for value in hcloud_ssh_key.ssh_keys: value.id] |
|
|
|
|
|
|
|
|
|
|
|
lifecycle { |
|
|
|
|
|
ignore_changes = [ |
|
|
|
|
|
ssh_keys, |
|
|
|
|
|
] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for_each = local.hetzner_vm_hosts |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Volumes |
|
|
|
|
|
|
|
|
|
|
|
locals { |
|
|
|
|
|
hetzner_volumes = { for item in flatten([ |
|
|
|
|
|
for hostname, host in local.hetzner_vm_hosts: [ |
|
|
|
|
|
for volumename, volume in lookup(host, "volumes", {}): { |
|
|
|
|
|
hostname = hostname |
|
|
|
|
|
volumename = volumename |
|
|
|
|
|
volume = volume |
|
|
|
|
|
host = host |
|
|
|
|
|
} |
|
|
|
|
|
] |
|
|
|
|
|
]): "${item.hostname}--${item.volumename}" => merge(item.volume,{hostname=item.hostname}) } |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resource "hcloud_volume" "volumes" { |
|
|
|
|
|
name = each.key |
|
|
|
|
|
|
|
|
|
|
|
location = var.hetzner_default_location |
|
|
|
|
|
size = each.value.size |
|
|
|
|
|
|
|
|
|
|
|
for_each = local.hetzner_volumes |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
resource "hcloud_volume_attachment" "volume_attachments" { |
|
|
|
|
|
volume_id = hcloud_volume.volumes[each.key].id |
|
|
|
|
|
server_id = hcloud_server.vms[each.value.hostname].id |
|
|
|
|
|
#automount = true |
|
|
|
|
|
for_each = local.hetzner_volumes |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Provider Variable |
|
|
|
|
|
|
|
|
|
|
|
locals { |
|
|
|
|
|
provider_hetzner = { |
|
|
|
|
|
hostvars = { |
|
|
|
|
|
for hostname, host in var.vm_hosts: hostname => |
|
|
|
|
|
{ |
|
|
|
|
|
external_ip = hcloud_server.vms[hostname].ipv4_address |
|
|
|
|
|
ansible_host = hcloud_server.vms[hostname].ipv4_address |
|
|
|
|
|
#internal_ip = hcloud_server_network.vms[hostname].ip |
|
|
|
|
|
volumes = { |
|
|
|
|
|
for volumename, volume in lookup(host, "volumes", {}): volumename => merge(volume,{ |
|
|
|
|
|
device = hcloud_volume.volumes["${hostname}--${volumename}"].linux_device |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if host.provider == "hetzner" |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |