infrastructure/05-argocd/main.tf
Rama main · réplica de lectura del repositorio original.
# ============================================================
# ArgoCD Bootstrap
# ============================================================
# Installs ArgoCD immediately after Cilium CNI bootstrap.
# This allows GitOps management of all cluster workloads.
#
# Based on: ci-cd/argocd/environments/prod/values.yaml
#
# After this runs, the cluster will have:
# - ArgoCD installed and running
# - App of Apps deployed (manages all other Applications)
# - Default AppProject configured
# - Full GitOps capability available
locals {
argocd_values = file("${var.project_root}/ci-cd/argocd/environments/prod/values.yaml")
argocd_app = yamldecode(
file("${var.project_root}/ci-cd/argocd/environments/prod/apps/argocd-helm.yaml")
)
argocd_chart_version = try(
local.argocd_app.spec.sources[0].targetRevision,
null
)
app_of_apps_manifest = yamldecode(
file("${var.project_root}/ci-cd/argocd/environments/prod/app-of-apps.yaml")
)
}
# ============================================================
# ArgoCD Helm Release
# ============================================================
# Installs ArgoCD from the official Helm chart using the same
# values as ci-cd/argocd/environments/prod/values.yaml
resource "helm_release" "argocd" {
name = "argocd"
repository = "https://argoproj.github.io/argo-helm"
chart = "argo-cd"
version = local.argocd_chart_version
namespace = "argocd"
values = [local.argocd_values]
wait = true
wait_for_jobs = true
timeout = 600
create_namespace = true
depends_on = [data.kubernetes_namespace_v1.probe]
}
# ============================================================
# App of Apps Deployment
# ============================================================
# Deploys the root Application that manages all other ArgoCD
# Applications via the app-of-apps pattern using kubectl.
# Uses null_resource because kubernetes_manifest validates during
# plan phase before ArgoCD CRDs exist.
resource "null_resource" "app_of_apps" {
triggers = {
manifest_hash = md5(yamlencode(local.app_of_apps_manifest))
manifest = yamlencode(local.app_of_apps_manifest)
infra_root = var.infra_root
}
depends_on = [
helm_release.argocd,
kubernetes_secret_v1.longhorn_crypto,
kubernetes_secret_v1.longhorn_b2,
]
provisioner "local-exec" {
interpreter = ["bash", "-c"]
command = <<-EOT
source ${self.triggers.infra_root}/scripts/common.sh # Change to self.triggers
load_tf_kube_env
kubectl_wrapper apply -f - \
<<'MANIFEST'
${self.triggers.manifest} # Change to self.triggers
MANIFEST
EOT
}
provisioner "local-exec" {
when = destroy
interpreter = ["bash", "-c"]
command = <<-EOT
source ${self.triggers.infra_root}/scripts/common.sh # Change to self.triggers
load_tf_kube_env
kubectl_wrapper delete application --ignore-not-found -f - \
<<'MANIFEST'
${self.triggers.manifest} # Change to self.triggers
MANIFEST
EOT
}
}