prole/deploy/opentofu/prod/main.tf

58 lines
1.6 KiB
HCL

terraform {
required_version = ">= 1.6.0"
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.30"
}
}
}
# Configure for AWS EKS or GCloud GKE via variables
provider "kubernetes" {
host = var.cluster_endpoint
token = var.cluster_token
cluster_ca_certificate = var.cluster_ca_cert != "" ? base64decode(var.cluster_ca_cert) : null
insecure = var.cluster_ca_cert == ""
}
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", "PersistentVolume", "StorageClass",
])
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]
}