feat(tf): offsite environment — askari (CAX11/hel1/debian-13)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
sjat 2026-06-14 12:03:31 +02:00
parent bbc287900a
commit 127ade59a3
6 changed files with 72 additions and 0 deletions

View file

@ -0,0 +1,4 @@
# Terraform state: LOCAL, on the control node (like the Proxmox envs; ADR-006).
# askari survives a homelab outage by design, so a lost state is recovered by
# `terraform import` of the running server not a rebuild. Back the state up with
# the control node (ADR-022).

View file

@ -0,0 +1,19 @@
# offsite/main.tf off-site Hetzner hosts. Terraform owns VM existence (ADR-006,
# generalized to Hetzner). ALWAYS `make tf-plan TF_ENV=offsite` and review before
# `make tf-apply TF_ENV=offsite`.
module "askari" {
source = "../../modules/hetzner_vm"
name = "askari"
server_type = "cax11" # ARM, 2 vCPU / 4 GB
location = "hel1" # Helsinki
image = "debian-13"
ansible_ssh_pubkey = var.ansible_ssh_pubkey
ssh_admin_cidrs = var.ssh_admin_cidrs
labels = {
env = "offsite"
group = "offsite_hosts"
managed-by = "terraform"
}
}

View file

@ -0,0 +1,9 @@
output "vms" {
description = "Hostname -> IP and Ansible group — consumed by make tf-inventory-offsite"
value = {
askari = {
ip = module.askari.ipv4_address
group = "offsite_hosts"
}
}
}

View file

@ -0,0 +1,15 @@
# verified: hetznercloud/hcloud 1.65.0 · debian-13 image · cax11@hel1 · terraform-registry · 2026-06-14
terraform {
required_version = ">= 1.9"
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "~> 1.65"
}
}
}
provider "hcloud" {
token = var.hcloud_token
}

View file

@ -0,0 +1,10 @@
# offsite environment — non-secret values. Copy to terraform.tfvars and fill in.
#
# Secret is exported as an env var (never in this file); the make tf-* targets do this
# automatically for TF_ENV=offsite, sourcing vault.hetzner.token:
# export TF_VAR_hcloud_token="...from vault.hetzner.token..."
#
# State is local (see backend.tf).
ansible_ssh_pubkey = "ssh-ed25519 AAAA... ansible@ubongo"
ssh_admin_cidrs = ["10.20.10.151/32"] # ubongo's LAN address (ADR-021)

View file

@ -0,0 +1,15 @@
variable "hcloud_token" {
description = "Hetzner Cloud API token — set via TF_VAR_hcloud_token (from vault.hetzner.token)"
type = string
sensitive = true
}
variable "ansible_ssh_pubkey" {
description = "ubongo's control SSH public key, provisioned for the ansible user"
type = string
}
variable "ssh_admin_cidrs" {
description = "Source CIDRs allowed to SSH askari (ubongo's address/32)"
type = list(string)
}