♻️ Switch Hetzner to the new Terraform system

This commit is contained in:
Jérôme Petazzoni
2023-03-04 15:24:51 +01:00
parent 84f131cdc5
commit d8f8bf6d87
5 changed files with 96 additions and 62 deletions
+2 -5
View File
@@ -1,5 +1,2 @@
INFRACLASS=hetzner
if ! [ -f ~/.config/hcloud/cli.toml ]; then
warning "~/.config/hcloud/cli.toml not found."
warning "Make sure that the Hetzner CLI (hcloud) is installed and configured."
fi
INFRACLASS=terraform
TERRAFORM=hetzner
-57
View File
@@ -1,57 +0,0 @@
if ! command -v hcloud >/dev/null; then
warning "Hetzner CLI (hcloud) not found."
fi
if ! [ -f ~/.config/hcloud/cli.toml ]; then
warning "~/.config/hcloud/cli.toml not found."
fi
infra_list() {
[ "$(hcloud server list -o json)" = "null" ] && return
hcloud server list -o json |
jq -r '.[] | [.id, .name , .status, .server_type.name] | @tsv'
}
infra_start() {
COUNT=$1
HETZNER_INSTANCE_TYPE=${HETZNER_INSTANCE_TYPE-cx21}
HETZNER_DATACENTER=${HETZNER_DATACENTER-nbg1-dc3}
HETZNER_IMAGE=${HETZNER_IMAGE-168855}
for I in $(seq 1 $COUNT); do
NAME=$(printf "%s-%03d" $TAG $I)
sep "Starting instance $I/$COUNT"
info " Datacenter: $HETZNER_DATACENTER"
info " Name: $NAME"
info " Instance type: $HETZNER_INSTANCE_TYPE"
hcloud server create \
--type=${HETZNER_INSTANCE_TYPE} \
--datacenter=${HETZNER_DATACENTER} \
--image=${HETZNER_IMAGE} \
--name=$NAME \
--label=tag=$TAG \
--ssh-key ~/.ssh/id_rsa.pub
done
hetzner_get_ips_by_tag $TAG > tags/$TAG/ips.txt
}
infra_stop() {
for ID in $(hetzner_get_ids_by_tag $TAG); do
info "Scheduling deletion of instance $ID..."
hcloud server delete $ID &
done
info "Waiting for deletion to complete..."
wait
}
hetzner_get_ids_by_tag() {
TAG=$1
hcloud server list --selector=tag=$TAG -o json | jq -r .[].name
}
hetzner_get_ips_by_tag() {
TAG=$1
hcloud server list --selector=tag=$TAG -o json | jq -r .[].public_net.ipv4.ip
}
+34
View File
@@ -0,0 +1,34 @@
resource "hcloud_server" "_" {
count = var.how_many_nodes
name = format("%s-%04d", var.prefix, count.index + 1)
location = var.location
server_type = var.size
ssh_keys = [hcloud_ssh_key._.id]
image = "ubuntu-22.04"
}
resource "hcloud_ssh_key" "_" {
name = var.prefix
public_key = tls_private_key.ssh.public_key_openssh
}
output "ip_addresses" {
value = join("", formatlist("%s\n", hcloud_server._.*.ipv4_address))
}
resource "tls_private_key" "ssh" {
algorithm = "RSA"
rsa_bits = "4096"
}
resource "local_file" "ssh_private_key" {
content = tls_private_key.ssh.private_key_pem
filename = "id_rsa"
file_permission = "0600"
}
resource "local_file" "ssh_public_key" {
content = tls_private_key.ssh.public_key_openssh
filename = "id_rsa.pub"
file_permission = "0600"
}
+18
View File
@@ -0,0 +1,18 @@
terraform {
required_version = ">= 1"
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
}
}
}
/*
Okay, the following is pretty gross - it uses the first token found in the hcloud CLI
configuration file. We don't use Hetzner much anyway, and when we do, we only have one
profile ever, and we want this thing to Just Work; so this should do for now, but might
need to be improved if others actively use Hetzner to provision training labs.
*/
provider hcloud {
token = regex("token = \"([A-Za-z0-9]+)\"", file("~/.config/hcloud/cli.toml"))[0]
}
@@ -0,0 +1,42 @@
variable "prefix" {
type = string
default = "provisioned-with-terraform"
}
variable "how_many_nodes" {
type = number
default = 2
}
/*
$ hcloud server-type list | grep shared
1 cx11 1 shared 2.0 GB 20 GB local
3 cx21 2 shared 4.0 GB 40 GB local
5 cx31 2 shared 8.0 GB 80 GB local
7 cx41 4 shared 16.0 GB 160 GB local
9 cx51 8 shared 32.0 GB 240 GB local
22 cpx11 2 shared 2.0 GB 40 GB local
23 cpx21 3 shared 4.0 GB 80 GB local
24 cpx31 4 shared 8.0 GB 160 GB local
25 cpx41 8 shared 16.0 GB 240 GB local
26 cpx51 16 shared 32.0 GB 360 GB local
*/
variable "size" {
type = string
default = "cx21"
}
/*
$ hcloud location list
ID NAME DESCRIPTION NETWORK ZONE COUNTRY CITY
1 fsn1 Falkenstein DC Park 1 eu-central DE Falkenstein
2 nbg1 Nuremberg DC Park 1 eu-central DE Nuremberg
3 hel1 Helsinki DC Park 1 eu-central FI Helsinki
4 ash Ashburn, VA us-east US Ashburn, VA
5 hil Hillsboro, OR us-west US Hillsboro, OR
*/
variable "location" {
type = string
default = "hel1"
}