2022-03-09 05:42:56 +01:00
|
|
|
resource "random_string" "server" {
|
|
|
|
length = 3
|
|
|
|
lower = true
|
|
|
|
special = false
|
|
|
|
number = false
|
|
|
|
upper = false
|
|
|
|
|
2022-03-05 15:25:43 +01:00
|
|
|
keepers = {
|
|
|
|
# We re-create the id (and server) whenever one of those attributes
|
|
|
|
# changes. This should include all input variables to this module,
|
|
|
|
# but NO SENSITIVE values as they might be logged here.
|
2022-03-08 08:27:48 +01:00
|
|
|
name = var.name
|
|
|
|
public_key = var.public_key
|
2022-03-05 15:25:43 +01:00
|
|
|
additional_public_keys = join(",", var.additional_public_keys)
|
2022-03-08 08:27:48 +01:00
|
|
|
firewall_ids = join(",", var.firewall_ids)
|
|
|
|
placement_group_id = var.placement_group_id
|
|
|
|
labels = join(",", [for k, v in var.labels : "${k}=${v}"])
|
|
|
|
ipv4_subnet_id = var.ipv4_subnet_id
|
|
|
|
private_ipv4 = var.private_ipv4
|
|
|
|
server_type = var.server_type
|
|
|
|
|
|
|
|
# Excluding these for now as they are part of the ignore_changes below
|
|
|
|
#ssh_keys = join(",", var.ssh_keys)
|
|
|
|
#location = var.location
|
2022-03-05 15:25:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-19 13:38:24 +01:00
|
|
|
resource "hcloud_server" "server" {
|
2022-03-05 15:25:43 +01:00
|
|
|
name = local.name
|
2022-02-19 13:38:24 +01:00
|
|
|
|
|
|
|
image = "ubuntu-20.04"
|
|
|
|
rescue = "linux64"
|
|
|
|
server_type = var.server_type
|
|
|
|
location = var.location
|
|
|
|
ssh_keys = var.ssh_keys
|
|
|
|
firewall_ids = var.firewall_ids
|
|
|
|
placement_group_id = var.placement_group_id
|
2022-02-23 19:36:03 +01:00
|
|
|
user_data = data.template_cloudinit_config.config.rendered
|
2022-02-19 13:38:24 +01:00
|
|
|
|
2022-02-28 16:03:44 +01:00
|
|
|
labels = var.labels
|
2022-02-23 19:36:03 +01:00
|
|
|
|
2022-02-23 19:36:03 +01:00
|
|
|
# Prevent destroying the whole cluster if the user changes
|
|
|
|
# any of the attributes that force to recreate the servers.
|
|
|
|
lifecycle {
|
|
|
|
ignore_changes = [
|
|
|
|
location,
|
|
|
|
ssh_keys,
|
|
|
|
user_data,
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
2022-02-19 13:38:24 +01:00
|
|
|
connection {
|
|
|
|
user = "root"
|
|
|
|
private_key = local.ssh_private_key
|
|
|
|
agent_identity = local.ssh_identity
|
|
|
|
host = self.ipv4_address
|
|
|
|
}
|
|
|
|
|
|
|
|
# Install MicroOS
|
|
|
|
provisioner "remote-exec" {
|
2022-03-01 21:57:57 +01:00
|
|
|
inline = [
|
|
|
|
"set -ex",
|
|
|
|
"apt-get update",
|
|
|
|
"apt-get install -y aria2",
|
2022-03-03 02:47:14 +01:00
|
|
|
"aria2c --follow-metalink=mem https://download.opensuse.org/tumbleweed/appliances/openSUSE-MicroOS.x86_64-OpenStack-Cloud.qcow2.meta4",
|
2022-03-01 21:57:57 +01:00
|
|
|
"qemu-img convert -p -f qcow2 -O host_device $(ls -a | grep -ie '^opensuse.*microos.*qcow2$') /dev/sda",
|
|
|
|
]
|
2022-03-03 01:56:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
# Issue a reboot command and wait for MicroOS to reboot and be ready
|
|
|
|
provisioner "local-exec" {
|
|
|
|
command = <<-EOT
|
|
|
|
ssh ${local.ssh_args} root@${self.ipv4_address} '(sleep 2; reboot)&'; sleep 3
|
|
|
|
until ssh ${local.ssh_args} -o ConnectTimeout=2 root@${self.ipv4_address} true 2> /dev/null
|
|
|
|
do
|
|
|
|
echo "Waiting for MicroOS to reboot and become available..."
|
|
|
|
sleep 3
|
|
|
|
done
|
|
|
|
EOT
|
|
|
|
}
|
|
|
|
|
|
|
|
# Install k3s-selinux (compatible version)
|
|
|
|
provisioner "remote-exec" {
|
|
|
|
inline = [
|
|
|
|
"set -ex",
|
|
|
|
"transactional-update pkg install -y k3s-selinux"
|
|
|
|
]
|
2022-02-19 13:38:24 +01:00
|
|
|
}
|
|
|
|
|
2022-03-02 02:06:31 +01:00
|
|
|
# Issue a reboot command and wait for MicroOS to reboot and be ready
|
2022-02-19 13:38:24 +01:00
|
|
|
provisioner "local-exec" {
|
|
|
|
command = <<-EOT
|
2022-03-02 02:06:31 +01:00
|
|
|
ssh ${local.ssh_args} root@${self.ipv4_address} '(sleep 2; reboot)&'; sleep 3
|
2022-02-19 13:38:24 +01:00
|
|
|
until ssh ${local.ssh_args} -o ConnectTimeout=2 root@${self.ipv4_address} true 2> /dev/null
|
|
|
|
do
|
|
|
|
echo "Waiting for MicroOS to reboot and become available..."
|
2022-02-20 11:30:07 +01:00
|
|
|
sleep 3
|
2022-02-19 13:38:24 +01:00
|
|
|
done
|
|
|
|
EOT
|
|
|
|
}
|
|
|
|
}
|
2022-02-24 17:57:36 +01:00
|
|
|
|
|
|
|
resource "hcloud_server_network" "server" {
|
2022-02-26 12:26:14 +01:00
|
|
|
ip = var.private_ipv4
|
2022-02-25 19:16:38 +01:00
|
|
|
server_id = hcloud_server.server.id
|
2022-02-26 12:26:14 +01:00
|
|
|
subnet_id = var.ipv4_subnet_id
|
2022-02-24 17:57:36 +01:00
|
|
|
}
|
2022-02-23 19:36:03 +01:00
|
|
|
|
|
|
|
data "template_cloudinit_config" "config" {
|
|
|
|
gzip = true
|
|
|
|
base64_encode = true
|
|
|
|
|
|
|
|
# Main cloud-config configuration file.
|
|
|
|
part {
|
|
|
|
filename = "init.cfg"
|
|
|
|
content_type = "text/cloud-config"
|
|
|
|
content = templatefile(
|
|
|
|
"${path.module}/templates/userdata.yaml.tpl",
|
|
|
|
{
|
2022-03-05 15:25:43 +01:00
|
|
|
hostname = local.name
|
2022-02-23 19:36:03 +01:00
|
|
|
sshAuthorizedKeys = concat([local.ssh_public_key], var.additional_public_keys)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|