prole/deploy/opentofu/k3s/main.tf

72 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 : merge(
m,
{
metadata = merge(
lookup(m, "metadata", {}),
{ for k, v in { namespace = var.namespace } : k => v if !contains(local.cluster_scoped_kinds, m.kind) }
)
}
)
]
}
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]
}