prole/deploy/opentofu/k3s/main.tf
chrisfu da2f6600ba feat: infrastructure and installer updates for k3s, OpenTofu, and prole-db
- Add k3s start/stop Ansible playbooks and roles.

- Implement OpenTofu initialization scripts and k8s manifests.

- Update ncurses installer with OpenTofu support and improved k3s integration.

- Add mode support (--mode) to etc/ initialization scripts.

- Update prole-db with recovery, barman objectstore, and SSH OpenBao support.

- Refine k8s manifests for OpenBao and prole-db.
2026-02-05 21:27:18 -08:00

73 lines
1.6 KiB
HCL

terraform {
required_version = ">= 1.6.0"
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.30"
}
}
}
provider "kubernetes" {
host = var.k3s_server_url
token = var.k3s_token
insecure = true
}
locals {
manifest_dir = "${path.module}/manifests"
manifest_files = fileset(local.manifest_dir, "**/*.yaml")
raw_documents = flatten([
for f in local.manifest_files : [
for doc in split("\n---", trimspace(file("${local.manifest_dir}/${f}"))) :
trimspace(doc)
if trimspace(doc) != ""
]
])
decoded_documents = [
for doc in local.raw_documents : yamldecode(doc)
if try(yamldecode(doc).kind, "") != ""
]
cluster_scoped_kinds = toset([
"Namespace",
"CustomResourceDefinition",
"ClusterRole",
"ClusterRoleBinding",
"ClusterIssuer",
"PersistentVolume",
"StorageClass",
"MutatingWebhookConfiguration",
"ValidatingWebhookConfiguration",
])
namespaced_documents = [
for m in local.decoded_documents :
contains(local.cluster_scoped_kinds, m.kind) ? m : merge(
m,
{
metadata = merge(
lookup(m, "metadata", {}),
{ namespace = var.namespace }
)
}
)
]
}
resource "kubernetes_manifest" "namespace" {
manifest = {
apiVersion = "v1"
kind = "Namespace"
metadata = { name = var.namespace }
}
}
resource "kubernetes_manifest" "resources" {
for_each = { for idx, m in local.namespaced_documents : tostring(idx) => m }
manifest = each.value
depends_on = [kubernetes_manifest.namespace]
}