Saltar a contenido

Terraform CI (plan/apply)

CI/CD de la infraestructura de Proxmox (terraform/): valida los cambios en cada PR y los aplica automáticamente al mergear a main, en el runner self-hosted ARC.

Resumen

La infraestructura de Proxmox (VMs k3s, discos, PCI) se define en terraform/. Dos workflows de GitHub Actions automatizan su ciclo de vida: un plan en cada PR (con comentario del resultado) y un apply al mergear a main. Ambos corren en el runner self-hosted homelab (ARC, dentro de la LAN) para poder llegar a la API de Proxmox, que ya no se publica en Internet.

Estado

Campo Valor
Estado Operativo
Argo CD Application — (GitHub Actions; no vive en el cluster)
Namespace —

Despliegue

Campo Valor
Método Workflows de GitHub Actions
Runner ARC self-hosted runs-on: homelab (ver ARC)
Contenedor del job ubuntu:24.04 (el scale set usa containerMode: kubernetes)
Origen .github/workflows/terraform-plan.yml, .github/workflows/terraform-apply.yml
Objetivo API de Proxmox (https://192.168.1.10:8006/)
State R2 (homelab-infra-tfstate)

Red

Campo Valor
Service — (job en el runner; salida a 192.168.1.10:8006)
URL —
TLS Autofirmado en pveproxy; el provider usa insecure = true

Acceso y usuarios

  • Secrets de GitHub: PROXMOX_API_TOKEN (token limitado al pool k8s-homelab), R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY para el backend del state.
  • El endpoint de la API es el default de terraform/variables.tf (https://192.168.1.10:8006/); no se pasa por secreto.

Seguridad

  • El token de Proxmox solo tiene ACL sobre /pool/k8s-homelab; el state solo contiene recursos de este repo y las VMs/discos tienen lifecycle { prevent_destroy = true }.
  • El repo es privado, los runners son efímeros y el apply solo se dispara con push a main (workflow_dispatch para re-ejecutar a mano).
  • Los disparadores de PR usan pull_request (nunca pull_request_target): un PR de un fork no recibe secretos.

Configuración

  • terraform-plan.yml publica el plan como comentario en el PR y falla si el plan falla.
  • terraform-apply.yml se dispara con push a main y workflow_dispatch; tiene concurrency: terraform-apply y el state en R2 usa use_lockfile.
  • Disparadores: paths: terraform/** y el propio workflow.
  • Los jobs declaran container: ubuntu:24.04 porque el scale set ARC usa containerMode: kubernetes; el primer step instala git, curl, unzip y ca-certificates para actions/checkout y hashicorp/setup-terraform.

Almacenamiento

  • State remoto en R2: homelab-infra-tfstate.

Dependencias

  • Depende de: ARC (runner), Proxmox (192.168.1.10:8006) y R2.
  • Usado por: —.

Backup y recuperación

  • State remoto en R2; re-ejecutable desde Git. (El bucket se creó a mano; el versionado no está verificado.)

Monitorización

  • No aplica (GitHub Actions; historial en la pestaña Actions).

Referencias

Notas / TODO

  • Si el clúster (y por tanto ARC) está caído, el workflow_dispatch también queda en cola. Plan B: cd terraform && terraform apply desde un host de la LAN con TF_VAR_proxmox_api_token (ver runbook de Proxmox).
  • El plan corre también en cambios de terraform/cloudflare/** por el patrón terraform/** (apply no-op de Proxmox).