#!/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}[ERROR]${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 " - 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 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!"