Pular para o conteúdo principal

Capítulo 12.3 - Automação Completa

Objetivos de Aprendizagem​

Ao final deste capítulo, você será capaz de:

  • Criar sistemas de automação completos
  • Integrar cron com scripts avançados
  • Implementar workflows automatizados
  • Gerenciar erros e retry
  • Criar sistemas de notificação
  • Documentar a automação

Arquitetura de Automação​

Componentes​

Elementos:

  • Agendamento (cron/systemd timers)
  • Scripts executáveis
  • Logging
  • Notificações
  • Monitoramento

Framework de Automação​

Estrutura Básica​

#!/bin/bash
# Framework automação

set -euo pipefail

# Configuração
SCRIPT_NAME="minha-automacao"
LOG_DIR="/var/log/automation"
LOCK_DIR="/var/run/automation"
NOTIFY_EMAIL="admin@example.com"

# Funções utilitárias
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_DIR/$SCRIPT_NAME.log"
}

notify() {
local subject="$1"
local message="$2"
echo "$message" | mail -s "$subject" "$NOTIFY_EMAIL"
}

cleanup() {
rm -f "$LOCK_DIR/$SCRIPT_NAME.lock"
log "Limpeza concluída"
}

# Trap para limpeza
trap cleanup EXIT

# Lock file
LOCK_FILE="$LOCK_DIR/$SCRIPT_NAME.lock"
if [ -f "$LOCK_FILE" ]; then
log "Script já está em execução"
exit 1
fi
touch "$LOCK_FILE"

# Código principal
main() {
log "Início da automação"

# Tarefas...
task1
task2
task3

log "Fim da automação"
}

main "$@"

Workflows Automatizados​

Backup Automatizado​

#!/bin/bash
# Backup automatizado completo

set -euo pipefail

BACKUP_DIR="/backup"
SOURCES=("/data" "/etc" "/home")
RETENTION_DAYS=7
LOG="/var/log/backup.log"

log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"
}

backup_source() {
local source="$1"
local dest="$BACKUP_DIR/$(basename $source)-$(date +%Y%m%d).tar.gz"

log "Backup: $source -> $dest"
tar -czf "$dest" "$source" || {
log "ERRO: Falha no backup $source"
return 1
}

log "Sucesso: $dest criado ($(du -h $dest | cut -f1))"
}

# Backup de cada fonte
for source in "${SOURCES[@]}"; do
backup_source "$source"
done

# Limpeza de backups antigos
log "Limpando backups > $RETENTION_DAYS dias"
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

log "Backup concluído"

Monitoramento Automatizado​

#!/bin/bash
# Monitoramento automatizado

THRESHOLDS=(
"CPU:80"
"MEM:85"
"DISK:90"
)

check_threshold() {
local metric="$1"
local threshold="$2"
local value

case "$metric" in
CPU)
value=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | sed 's/%us,//')
;;
MEM)
value=$(free | grep Mem | awk '{printf "%.0f", $3/$2 * 100}')
;;
DISK)
value=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
;;
esac

if [ "$value" -gt "$threshold" ]; then
echo "ALERTA: $metric em ${value}% (limite: ${threshold}%)"
return 1
fi
return 0
}

# Verificar todos os limites
for threshold in "${THRESHOLDS[@]}"; do
metric=$(echo $threshold | cut -d: -f1)
value=$(echo $threshold | cut -d: -f2)
check_threshold "$metric" "$value" || notify "Alerta $metric" "$metric excedido"
done

Gerenciamento de Erros e Retry​

Função Retry​

retry() {
local max_attempts="$1"
local delay="$2"
shift 2
local command="$@"

local attempt=1
while [ $attempt -le $max_attempts ]; do
if $command; then
return 0
fi

if [ $attempt -lt $max_attempts ]; then
log "Tentativa $attempt/$max_attempts falhou, retry em ${delay}s"
sleep "$delay"
fi

attempt=$((attempt + 1))
done

log "ERRO: Todas as tentativas falharam"
return 1
}

# Uso
retry 3 5 wget http://example.com/file.txt

Gerenciamento Avançado de Erros​

#!/bin/bash
# Gerenciamento completo de erros

ERROR_LOG="/var/log/automation-errors.log"

handle_error() {
local line="$1"
local command="$2"
local exit_code="$3"

echo "[$(date)] ERRO linha $line: $command (código: $exit_code)" >> "$ERROR_LOG"

# Notificação
echo "Erro na automação linha $line" | \
mail -s "Erro Automação" admin@example.com

# Logging
log "ERRO: $command (linha $line, código $exit_code)"
}

# Trap erros
trap 'handle_error $LINENO "$BASH_COMMAND" $?' ERR

# Código com gerenciamento de erros
set -e
# ...

Sistema de Notificação​

Notificações Multi-Canal​

#!/bin/bash
# Sistema de notificação

notify() {
local level="$1" # info, warning, error
local message="$2"

# Email
echo "$message" | mail -s "[$level] Automação" admin@example.com

# Slack (se configurado)
if [ -n "$SLACK_WEBHOOK" ]; then
local color="good"
[ "$level" = "error" ] && color="danger"
[ "$level" = "warning" ] && color="warning"

curl -X POST -H 'Content-type: application/json' \
--data "{\"attachments\":[{\"color\":\"$color\",\"text\":\"$message\"}]}" \
"$SLACK_WEBHOOK" 2>/dev/null || true
fi

# Log
log "[$level] $message"
}

# Uso
notify "info" "Tarefa iniciada"
notify "warning" "Atenção: limite próximo"
notify "error" "ERRO: Falha na tarefa"

Documentação da Automação​

Runbook de Automação​

# Runbook: Sistema de Automação

## Visão Geral
Sistema automatizado para manutenção e monitoramento

## Componentes
- Cron: Agendamento de tarefas
- Scripts: /usr/local/bin/automation/
- Logs: /var/log/automation/
- Notificações: Email + Slack

## Tarefas Agendadas
- Backup: Diário 2h
- Monitoramento: A cada 5 minutos
- Limpeza: Semanal domingo 3h
- Relatórios: Diário 8h

## Troubleshooting
- Verificar logs: /var/log/automation/
- Verificar cron: grep CRON /var/log/syslog
- Verificar locks: /var/run/automation/

Documentação dos Scripts​

#!/bin/bash
# Script: minha-automacao.sh
# Autor: Admin
# Data: 2024-12
# Descrição: Automação completa de manutenção
# Uso: Executado pelo cron
# Dependências: mail, curl
# Logs: /var/log/automation/minha-automacao.log

Exemplo Completo​

Sistema de Automação de Produção​

#!/bin/bash
# /usr/local/bin/automation-production.sh
# Sistema de automação de produção

set -euo pipefail

# Configuração
SCRIPT_DIR="/usr/local/bin/automation"
LOG_DIR="/var/log/automation"
LOCK_DIR="/var/run/automation"
NOTIFY_EMAIL="admin@example.com"

# Criar diretórios
mkdir -p "$LOG_DIR" "$LOCK_DIR"

# Lock
LOCK="$LOCK_DIR/production.lock"
[ -f "$LOCK" ] && exit 1
touch "$LOCK"
trap "rm -f $LOCK" EXIT

# Logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_DIR/production.log"
}

# Notificação
notify() {
echo "$*" | mail -s "Automação Produção" "$NOTIFY_EMAIL"
}

# Tarefas
log "=== Início da automação ==="

# 1. Monitoramento
log "Monitoramento..."
"$SCRIPT_DIR/monitor.sh" || notify "Alerta: Monitoramento falhou"

# 2. Backup
log "Backup..."
"$SCRIPT_DIR/backup.sh" || notify "Alerta: Backup falhou"

# 3. Limpeza
log "Limpeza..."
"$SCRIPT_DIR/cleanup.sh"

# 4. Relatório
log "Gerando relatório..."
"$SCRIPT_DIR/report.sh"

log "=== Fim da automação ==="
notify "Automação de produção concluída com sucesso"

Crontab de Produção​

# /etc/cron.d/production-automation
# Monitoramento a cada 5 minutos
*/5 * * * * root /usr/local/bin/automation/monitor.sh

# Backup diário 2h
0 2 * * * root /usr/local/bin/automation/backup.sh

# Limpeza semanal
0 3 * * 0 root /usr/local/bin/automation/cleanup.sh

# Relatório diário
0 8 * * * root /usr/local/bin/automation/report.sh

# Automação completa diária
0 1 * * * root /usr/local/bin/automation-production.sh

Resumo​

Neste capítulo, você aprendeu:

Arquitetura: Componentes do sistema de automação
Framework: Estrutura reutilizável, funções utilitárias
Workflows: Backup, monitoramento, tarefas complexas
Erros: Retry, gerenciamento avançado, logging
Notificações: Multi-canal, email, Slack
Documentação: Runbooks, comentários em scripts
Prática: Sistema de produção completo


Fim do Curso​

Parabéns! Você concluiu o treinamento Linux completo com automação cron avançada.

Próximos passos:

  • Praticar em servidores reais
  • Implementar suas próprias automações
  • Continuar aprendendo e explorando

Capítulo criado em: Dezembro 2024