#!/bin/bash ############################################################ # Aula 08 - Cleanup # Destrói a infraestrutura provisionada ############################################################ set -e # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERRO]${NC} $1"; } echo "" echo "============================================" echo " Cleanup - Destruir Infraestrutura" echo "============================================" echo "" # Verificar se tofu está instalado if ! command -v tofu &> /dev/null; then log_error "OpenTofu não encontrado!" exit 1 fi # Verificar se há state if [ ! -f "terraform.tfstate" ] && [ ! -d ".terraform" ]; then log_warn "Nenhuma infraestrutura encontrada para destruir." exit 0 fi # Verificar workers do autoscaler (criados fora do OpenTofu) if [ -f "kubeconfig" ]; then export KUBECONFIG="$SCRIPT_DIR/kubeconfig" AUTOSCALER_WORKERS=$(kubectl get nodes -l node.kubernetes.io/instance-type=cax11 \ --no-headers 2>/dev/null | wc -l | tr -d ' ' || echo "0") if [ "$AUTOSCALER_WORKERS" -gt "1" ]; then log_warn "Detectados $AUTOSCALER_WORKERS workers (incluindo os do autoscaler)" log_warn "Workers criados pelo autoscaler serão removidos via API Hetzner" echo "" fi fi log_warn "ATENÇÃO: Esta operação irá DESTRUIR todos os recursos!" echo "" echo "Recursos que serão removidos:" echo " - NGINX Ingress Controller" echo " - Hetzner CSI Driver" echo " - LoadBalancer (Hetzner LB)" echo " - 3x Control Plane nodes" echo " - Workers (incluindo os criados pelo autoscaler)" echo " - Rede privada" echo " - Floating IP" echo " - Firewall" echo " - Placement Group" echo "" read -p "Tem certeza que deseja continuar? (digite 'sim' para confirmar): " confirm if [ "$confirm" != "sim" ]; then log_info "Operação cancelada" exit 0 fi echo "" # Remover workers do autoscaler primeiro (se existirem) if [ -f "terraform.tfvars" ]; then HCLOUD_TOKEN=$(grep 'hcloud_token' terraform.tfvars | cut -d'"' -f2) CLUSTER_NAME=$(tofu output -raw cluster_name 2>/dev/null || echo "") if [ -n "$HCLOUD_TOKEN" ] && [ -n "$CLUSTER_NAME" ]; then log_info "Verificando workers do autoscaler..." # Listar servers com label do cluster que NÃO são gerenciados pelo tofu AUTOSCALER_SERVERS=$(HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud server list \ -l cluster="$CLUSTER_NAME" \ -o noheader -o columns=id,name 2>/dev/null | \ grep -E "worker-pool" || true) if [ -n "$AUTOSCALER_SERVERS" ]; then log_warn "Removendo workers criados pelo autoscaler..." echo "$AUTOSCALER_SERVERS" | while read -r server_id server_name; do log_info " Removendo $server_name (ID: $server_id)..." HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud server delete "$server_id" --quiet 2>/dev/null || true done log_success "Workers do autoscaler removidos" fi fi fi # ========================================================================== # Remover LoadBalancer criado pelo CCM (não gerenciado pelo OpenTofu) # ========================================================================== # O LoadBalancer é criado pelo Hetzner CCM quando o NGINX Ingress é instalado. # Ele está conectado à subnet e impede a destruição da rede se não for removido. log_info "Verificando LoadBalancer do Hetzner CCM..." # Tentar via kubectl primeiro (se cluster ainda acessível) if [ -f "kubeconfig" ]; then export KUBECONFIG="$SCRIPT_DIR/kubeconfig" if kubectl cluster-info &>/dev/null; then if kubectl get svc -n ingress-nginx nginx-ingress-ingress-nginx-controller &>/dev/null; then log_info "Removendo Service LoadBalancer via kubectl..." kubectl delete svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --timeout=60s 2>/dev/null || true sleep 10 # Aguardar CCM processar a remoção fi fi fi # Fallback: deletar diretamente via hcloud CLI if [ -f "terraform.tfvars" ]; then HCLOUD_TOKEN=$(grep 'hcloud_token' terraform.tfvars | cut -d'"' -f2) if [ -n "$HCLOUD_TOKEN" ]; then LB_NAME="k8s-ingress" # Nome definido no nginx-ingress-values.yaml if HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud load-balancer describe "$LB_NAME" &>/dev/null; then log_info "Removendo LoadBalancer '$LB_NAME' via hcloud CLI..." HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud load-balancer delete "$LB_NAME" --quiet 2>/dev/null || true log_success "LoadBalancer removido" sleep 5 # Aguardar Hetzner processar else log_info "LoadBalancer '$LB_NAME' não encontrado (OK)" fi fi fi # ========================================================================== # Remover NGINX Ingress Controller # ========================================================================== # Instalado pelo setup.sh para expor serviços HTTP/HTTPS/SSH if [ -f "kubeconfig" ]; then export KUBECONFIG="$SCRIPT_DIR/kubeconfig" if kubectl cluster-info &>/dev/null; then if helm status ingress-nginx -n ingress-nginx &>/dev/null; then log_info "Removendo NGINX Ingress Controller..." helm uninstall ingress-nginx -n ingress-nginx --wait 2>/dev/null || true kubectl delete namespace ingress-nginx --wait=false 2>/dev/null || true log_success "NGINX Ingress removido" sleep 5 # Aguardar processamento fi fi fi # ========================================================================== # Remover Hetzner CSI Driver # ========================================================================== # Instalado pelo setup.sh para provisionar volumes persistentes if [ -f "kubeconfig" ]; then export KUBECONFIG="$SCRIPT_DIR/kubeconfig" if kubectl cluster-info &>/dev/null; then if helm status hcloud-csi -n kube-system &>/dev/null; then log_info "Removendo Hetzner CSI Driver..." helm uninstall hcloud-csi -n kube-system --wait 2>/dev/null || true log_success "Hetzner CSI Driver removido" fi fi fi echo "" log_info "Destruindo infraestrutura via OpenTofu..." echo "" tofu destroy -auto-approve echo "" log_success "Infraestrutura destruída!" echo "" # Limpar arquivos locais (manter .terraform para re-deploy rápido) log_info "Limpando arquivos gerados..." rm -f kubeconfig talosconfig tfplan terraform.tfstate terraform.tfstate.backup log_success "Arquivos removidos" echo "" # Perguntar sobre terraform.tfvars if [ -f "terraform.tfvars" ]; then read -p "Remover terraform.tfvars também? (s/N): " remove_tfvars if [[ "$remove_tfvars" =~ ^[Ss]$ ]]; then rm -f terraform.tfvars log_success "terraform.tfvars removido" else log_info "terraform.tfvars mantido (útil para re-deploy)" fi fi echo "" log_success "Cleanup concluído!"