dezembro 21, 2025
19 min de leitura

Perguntas para Entrevista de Engenheiro DevOps Júnior: Guia Completo

interview
career-advice
job-search
entry-level
Perguntas para Entrevista de Engenheiro DevOps Júnior: Guia Completo
Milad Bonakdar

Milad Bonakdar

Autor

Domine os fundamentos essenciais de DevOps com perguntas abrangentes para entrevistas, cobrindo Linux, Git, CI/CD, Docker, conceitos básicos de nuvem e Infraestrutura como Código para engenheiros DevOps juniores.


Introdução

A engenharia DevOps une desenvolvimento e operações, focando em automação, colaboração e melhoria contínua. Como um(a) engenheiro(a) DevOps júnior, você precisará de conhecimento fundamental de Linux, controle de versão, pipelines de CI/CD, conteinerização e plataformas de nuvem.

Este guia cobre as perguntas essenciais para entrevistas de engenheiros(as) DevOps júnior, organizadas por tópico para ajudá-lo(a) a se preparar de forma eficaz. Cada pergunta inclui respostas detalhadas, exemplos práticos e trechos de código práticos.


Fundamentos do Linux

1. Explique os comandos comuns do Linux que você usa diariamente como engenheiro(a) DevOps.

Resposta: Comandos essenciais do Linux para o trabalho DevOps:

# Operações com arquivos
ls -la                    # Lista arquivos com detalhes
cd /var/log              # Muda o diretório
cat /etc/hosts           # Exibe o conteúdo do arquivo
tail -f /var/log/app.log # Acompanha o arquivo de log em tempo real
grep "error" app.log     # Procura padrões

# Gerenciamento de processos
ps aux | grep nginx      # Lista os processos
top                      # Monitora os recursos do sistema
kill -9 1234            # Força a finalização do processo
systemctl status nginx   # Verifica o status do serviço
systemctl restart nginx  # Reinicia o serviço

# Permissões de arquivo
chmod 755 script.sh      # Altera as permissões do arquivo
chown user:group file    # Altera a propriedade
ls -l                    # Exibe as permissões

# Uso do disco
df -h                    # Uso do espaço em disco
du -sh /var/log          # Tamanho do diretório
free -h                  # Uso de memória

# Rede
netstat -tulpn           # Mostra as portas de escuta
curl https://api.com     # Faz uma requisição HTTP
ping google.com          # Testa a conectividade
ssh user@server          # Login remoto

Raridade: Muito Comum
Dificuldade: Fácil


2. Como você soluciona um problema de um serviço que não está sendo iniciado no Linux?

Resposta: Abordagem sistemática para a solução de problemas:

# 1. Verifique o status do serviço
systemctl status nginx
# Procure por mensagens de erro

# 2. Verifique os logs
journalctl -u nginx -n 50
# ou
tail -f /var/log/nginx/error.log

# 3. Verifique a sintaxe da configuração
nginx -t

# 4. Verifique se a porta já está em uso
netstat -tulpn | grep :80
# ou
lsof -i :80

# 5. Verifique as permissões do arquivo
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. Verifique o espaço em disco
df -h

# 7. Tente iniciar manualmente para obter mais detalhes
nginx -g 'daemon off;'

# 8. Verifique SELinux/AppArmor (se ativado)
getenforce
ausearch -m avc -ts recent

Problemas comuns:

  • Erros de sintaxe na configuração
  • Porta já em uso
  • Permissão negada
  • Dependências ausentes
  • Espaço em disco insuficiente

Raridade: Muito Comum
Dificuldade: Média


Controle de versão com Git

3. Explique o fluxo de trabalho básico do Git e os comandos comuns.

Resposta: Fluxo de trabalho do Git para tarefas diárias de DevOps:

# Inicializar repositório
git init
git clone https://github.com/user/repo.git

# Verificar status
git status
git log --oneline

# Fluxo de trabalho básico
git add .                    # Adiciona as mudanças ao staging
git commit -m "Add feature"  # Commita as mudanças
git push origin main         # Envia para o remoto

# Branching
git branch feature-x         # Cria a branch
git checkout feature-x       # Troca para a branch
git checkout -b feature-y    # Cria e troca

# Merging
git checkout main
git merge feature-x

# Puxar as últimas mudanças
git pull origin main

# Desfazer mudanças
git reset --hard HEAD        # Descarta as mudanças locais
git revert abc123           # Reverte um commit específico

# Salvar mudanças temporariamente
git stash                    # Salva as mudanças temporariamente
git stash pop               # Restaura as mudanças salvas

# Visualizar diferenças
git diff                     # Mudanças não adicionadas ao staging
git diff --staged           # Mudanças adicionadas ao staging

Melhores práticas:

  • Escreva mensagens de commit claras
  • Commite com frequência, envie regularmente
  • Use branches de funcionalidade
  • Puxe antes de enviar
  • Revise as mudanças antes de commitar

Raridade: Muito Comum
Dificuldade: Fácil


4. Como você resolve um conflito de merge no Git?

Resposta: Resolução de conflito passo a passo:

# 1. Tentar o merge
git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 2. Verificar os arquivos com conflito
git status
# Unmerged paths:
#   both modified:   file.txt

# 3. Abrir o arquivo com conflito
cat file.txt
# <<<<<<< HEAD
# Conteúdo da branch atual
# =======
# Conteúdo da branch recebida
# >>>>>>> feature-branch

# 4. Editar o arquivo para resolver o conflito
# Remover os marcadores de conflito e manter as mudanças desejadas

# 5. Adicionar o arquivo resolvido ao staging
git add file.txt

# 6. Concluir o merge
git commit -m "Resolve merge conflict"

# Alternativa: Abortar o merge
git merge --abort

Marcadores de conflito:

  • <<<<<<< HEAD - Sua branch atual
  • ======= - Separador
  • >>>>>>> branch-name - Mudanças recebidas

Raridade: Comum
Dificuldade: Fácil-Média


Noções básicas de CI/CD

5. O que é CI/CD e por que é importante?

Resposta: CI/CD significa Integração Contínua e Entrega/Implantação Contínua.

Integração Contínua (CI):

  • Construir e testar o código automaticamente a cada commit
  • Detectar bugs precocemente
  • Garantir que o código se integra corretamente

Entrega Contínua (CD):

  • Implantar automaticamente em produção após a aprovação dos testes
  • Ciclos de lançamento mais rápidos
  • Redução de erros manuais
Loading diagram...

Benefícios:

  • Ciclos de feedback mais rápidos
  • Redução de problemas de integração
  • Testes automatizados
  • Implantações consistentes
  • Time to market mais rápido

Raridade: Muito Comum
Dificuldade: Fácil


6. Explique um pipeline básico de CI/CD usando o GitHub Actions.

Resposta: Exemplo de fluxo de trabalho do GitHub Actions:

# .github/workflows/ci-cd.yml
name: Pipeline de CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout do código
      uses: actions/checkout@v3
    
    - name: Configurar o Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    
    - name: Instalar as dependências
      run: npm ci
    
    - name: Executar os testes
      run: npm test
    
    - name: Construir a aplicação
      run: npm run build
    
    - name: Executar o linter
      run: npm run lint

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Implantar em produção
      run: |
        echo "Implantando em produção..."
        # Adicione os comandos de implantação aqui

Conceitos chave:

  • Gatilhos: Quando o pipeline é executado (push, PR, agendamento)
  • Jobs: Tarefas independentes que podem ser executadas em paralelo
  • Steps: Comandos individuais dentro de um job
  • Artifacts: Arquivos passados entre os jobs

Raridade: Muito Comum
Dificuldade: Média


Docker e conteinerização

7. O que é Docker e por que usamos contêineres?

Resposta: Docker é uma plataforma para desenvolver, enviar e executar aplicações em contêineres.

Contêineres vs VMs:

  • Os contêineres compartilham o kernel do SO do host (leve)
  • As VMs incluem o SO completo (pesado)
  • Os contêineres iniciam em segundos
  • Melhor utilização dos recursos

Benefícios:

  • Consistência: Mesmo ambiente em todos os lugares
  • Isolamento: Os aplicativos não interferem
  • Portabilidade: Executar em qualquer lugar
  • Eficiência: Leve e rápido
# Exemplo de Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

Raridade: Muito Comum
Dificuldade: Fácil


8. Explique os comandos comuns do Docker.

Resposta: Comandos essenciais do Docker:

# Imagens
docker pull nginx:latest          # Baixar imagem
docker images                     # Listar imagens
docker rmi nginx:latest          # Remover imagem
docker build -t myapp:1.0 .      # Construir imagem

# Contêineres
docker run -d -p 80:80 nginx     # Executar contêiner
docker ps                         # Listar contêineres em execução
docker ps -a                      # Listar todos os contêineres
docker stop container_id          # Parar contêiner
docker start container_id         # Iniciar contêiner
docker restart container_id       # Reiniciar contêiner
docker rm container_id            # Remover contêiner

# Logs e depuração
docker logs container_id          # Visualizar logs
docker logs -f container_id       # Acompanhar logs
docker exec -it container_id bash # Entrar no contêiner
docker inspect container_id       # Informações detalhadas

# Limpeza
docker system prune              # Remover dados não utilizados
docker volume prune              # Remover volumes não utilizados

# Docker Compose
docker-compose up -d             # Iniciar serviços
docker-compose down              # Parar serviços
docker-compose logs -f           # Visualizar logs

Raridade: Muito Comum
Dificuldade: Fácil


9. Escreva um docker-compose.yml para uma aplicação web com um banco de dados.

Resposta: Exemplo de aplicação multi-contêiner:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    restart: unless-stopped

volumes:
  postgres_data:

Conceitos chave:

  • services: Definir contêineres
  • depends_on: Dependências de serviço
  • volumes: Armazenamento de dados persistente
  • environment: Variáveis de ambiente
  • ports: Mapeamento de portas
  • restart: Política de reinicialização

Raridade: Comum
Dificuldade: Média


Noções básicas de nuvem

10. Explique a diferença entre IaaS, PaaS e SaaS.

Resposta: Modelos de serviço de nuvem:

IaaS (Infraestrutura como Serviço):

  • Fornece: Máquinas virtuais, armazenamento, redes
  • Você gerencia: SO, tempo de execução, aplicações
  • Exemplos: AWS EC2, Azure VMs, Google Compute Engine
  • Caso de uso: Controle total sobre a infraestrutura

PaaS (Plataforma como Serviço):

  • Fornece: Ambiente de tempo de execução, bancos de dados, middleware
  • Você gerencia: Aplicações e dados
  • Exemplos: AWS Elastic Beanstalk, Heroku, Google App Engine
  • Caso de uso: Foco no código, não na infraestrutura

SaaS (Software como Serviço):

  • Fornece: Aplicações completas
  • Você gerencia: Dados e configurações do usuário
  • Exemplos: Gmail, Salesforce, Office 365
  • Caso de uso: Aplicações prontas para uso
Loading diagram...

Raridade: Comum
Dificuldade: Fácil


11. Quais são os serviços básicos da AWS que um(a) engenheiro(a) DevOps deve conhecer?

Resposta: Serviços essenciais da AWS:

Compute:

  • EC2: Servidores virtuais
  • Lambda: Funções serverless
  • ECS/EKS: Orquestração de contêineres

Storage:

  • S3: Armazenamento de objetos
  • EBS: Armazenamento de blocos para EC2
  • EFS: Armazenamento de arquivos compartilhados

Networking:

  • VPC: Nuvem privada virtual
  • Route 53: Serviço DNS
  • CloudFront: CDN
  • ELB: Balanceamento de carga

Database:

  • RDS: Bancos de dados relacionais gerenciados
  • DynamoDB: Banco de dados NoSQL

DevOps Tools:

  • CodePipeline: Serviço de CI/CD
  • CodeBuild: Serviço de construção
  • CloudWatch: Monitoramento e registro de logs
  • IAM: Gerenciamento de acesso

Exemplo: Iniciar instância EC2 com AWS CLI:

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-group-ids sg-0123456789abcdef0 \
  --subnet-id subnet-0123456789abcdef0 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'

Raridade: Muito Comum
Dificuldade: Média


Infraestrutura como código

12. O que é Infraestrutura como Código (IaC) e por que é importante?

Resposta: IaC é gerenciar a infraestrutura por meio de código em vez de processos manuais.

Benefícios:

  • Controle de versão: Rastrear as mudanças na infraestrutura
  • Reprodutibilidade: Criar ambientes idênticos
  • Automação: Reduzir erros manuais
  • Documentação: O código serve como documentação
  • Consistência: Mesma configuração em todos os lugares

Ferramentas populares de IaC:

  • Terraform: Provisionamento multi-cloud
  • Ansible: Gerenciamento de configuração
  • CloudFormation: Específico para AWS
  • Pulumi: IaC baseado em código

Exemplo Terraform:

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "WebServer"
    Environment = "Production"
  }
}

resource "aws_security_group" "web_sg" {
  name        = "web-sg"
  description = "Allow HTTP traffic"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Raridade: Muito Comum
Dificuldade: Média


13. Explique o fluxo de trabalho básico do Terraform.

Resposta: Etapas do fluxo de trabalho do Terraform:

# 1. Inicializar o Terraform
terraform init
# Baixa os provedores e módulos

# 2. Formatar o código
terraform fmt
# Formata os arquivos .tf

# 3. Validar a configuração
terraform validate
# Verifica a sintaxe

# 4. Planejar as mudanças
terraform plan
# Mostra o que será criado/modificado/destruído

# 5. Aplicar as mudanças
terraform apply
# Cria/atualiza a infraestrutura
# Solicita confirmação

# 6. Visualizar o estado
terraform show
# Mostra o estado atual

# 7. Destruir a infraestrutura
terraform destroy
# Remove todos os recursos

Estrutura de arquivos do Terraform:

project/
├── main.tf          # Configuração principal
├── variables.tf     # Variáveis de entrada
├── outputs.tf       # Valores de saída
├── terraform.tfvars # Valores das variáveis
└── .terraform/      # Plugins do provedor

Exemplo de variáveis:

# variables.tf
variable "instance_type" {
  description = "Tipo de instância EC2"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "Nome do ambiente"
  type        = string
}

# terraform.tfvars
environment = "production"
instance_type = "t2.small"

Raridade: Comum
Dificuldade: Média


Monitoramento e registro de logs

14. Quais métricas você monitoraria para uma aplicação web?

Resposta: Métricas de monitoramento chave:

Métricas da aplicação:

  • Tempo de resposta / latência
  • Taxa de requisição (requisições por segundo)
  • Taxa de erros (erros 4xx, 5xx)
  • Throughput

Métricas do sistema:

  • Uso da CPU
  • Uso da memória
  • I/O do disco
  • I/O da rede

Métricas da infraestrutura:

  • Status do contêiner/pod
  • Disponibilidade do serviço
  • Saúde do balanceador de carga

Exemplo de consulta Prometheus:

# Tempo médio de resposta
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

# Taxa de erros
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

# Uso da CPU
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

Limiares de alerta:

  • Tempo de resposta > 500ms
  • Taxa de erros > 1%
  • Uso da CPU > 80%
  • Uso da memória > 85%
  • Uso do disco > 90%

Raridade: Comum
Dificuldade: Média


15. Como você centraliza os logs de vários servidores?

Resposta: Arquitetura de registro de logs centralizada:

Loading diagram...

Pilha comum (ELK):

  • Elasticsearch: Armazenar e indexar logs
  • Logstash/Fluentd: Coletar e processar logs
  • Kibana: Visualizar e pesquisar logs

Exemplo de configuração do Filebeat:

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    app: myapp
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  index: "app-logs-%{+yyyy.MM.dd}"

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

Melhores práticas:

  • Use registro de logs estruturado (JSON)
  • Inclua IDs de correlação
  • Defina políticas de retenção
  • Indexe estrategicamente
  • Monitore o volume de logs

Raridade: Comum
Dificuldade: Média


Noções básicas do Kubernetes

16. O que é Kubernetes e quais são seus componentes básicos?

Resposta: Kubernetes é uma plataforma de orquestração de contêineres que automatiza a implantação, o dimensionamento e o gerenciamento de aplicações em contêineres.

Componentes básicos:

Control Plane:

  • API Server: Ponto de entrada para todos os comandos
  • etcd: Armazenamento de chave-valor para dados do cluster
  • Scheduler: Atribui pods aos nós
  • Controller Manager: Mantém o estado desejado

Worker Nodes:

  • kubelet: Gerencia pods no nó
  • kube-proxy: Roteamento de rede
  • Container Runtime: Executa contêineres (Docker, containerd)
Loading diagram...

Objetos básicos do Kubernetes:

1. Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

2. Deployment:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

3. Service:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

Comandos comuns do kubectl:

# Obter recursos
kubectl get pods
kubectl get deployments
kubectl get services

# Descrever recurso
kubectl describe pod nginx-pod

# Criar a partir do arquivo
kubectl apply -f deployment.yaml

# Excluir recurso
kubectl delete pod nginx-pod

# Visualizar logs
kubectl logs nginx-pod

# Executar comando no pod
kubectl exec -it nginx-pod -- /bin/bash

# Encaminhamento de porta
kubectl port-forward pod/nginx-pod 8080:80

Raridade: Muito Comum
Dificuldade: Fácil


Gerenciamento de configuração

17. Explique os fundamentos do Ansible e escreva um playbook simples.

Resposta: Ansible é uma ferramenta de gerenciamento de configuração sem agente que usa SSH para configurar servidores.

Conceitos chave:

  • Inventory: Lista de servidores para gerenciar
  • Playbook: Arquivo YAML que define as tarefas
  • Modules: Unidades de trabalho reutilizáveis
  • Roles: Coleção organizada de tarefas

Arquivo de inventário:

# inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com

[all: vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

Playbook simples:

# playbook.yml
---
- name: Configurar Servidores Web
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: Atualizar o cache apt
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: Instalar os pacotes necessários
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: Criar usuário da aplicação
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: Copiar configuração do nginx
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Reiniciar nginx
    
    - name: Garantir que o nginx está sendo executado
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: Implantar aplicação
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main
      become_user: "{{ app_user }}"
  
  handlers:
    - name: Reiniciar nginx
      service:
        name: nginx
        state: restarted

Exemplo de template:

# templates/nginx.conf.j2
server {
    listen {{ app_port }};
    server_name {{ ansible_hostname }};
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Executando Playbooks:

# Verificar a sintaxe
ansible-playbook playbook.yml --syntax-check

# Execução simulada (modo de verificação)
ansible-playbook playbook.yml --check

# Executar o playbook
ansible-playbook -i inventory.ini playbook.yml

# Executar com tags específicas
ansible-playbook playbook.yml --tags "deploy"

# Limitar a hosts específicos
ansible-playbook playbook.yml --limit webservers

Estrutura de Roles do Ansible:

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    ├── vars/
    │   └── main.yml
    └── defaults/
        └── main.yml

Usando Roles:

---
- name: Configurar Infraestrutura
  hosts: all
  become: yes
  
  roles:
    - common
    - webserver
    - monitoring

Comandos Ad-hoc:

# Pingar todos os hosts
ansible all -i inventory.ini -m ping

# Executar comando em todos os hosts
ansible all -i inventory.ini -a "uptime"

# Instalar pacote
ansible webservers -i inventory.ini -m apt -a "name=nginx state=present" --become

# Copiar arquivo
ansible all -i inventory.ini -m copy -a "src=/local/file dest=/remote/file"

# Reiniciar serviço
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

Raridade: Comum
Dificuldade: Média


Scripting e automação

18. Escreva um script bash para automatizar uma tarefa comum de DevOps.

Resposta: O scripting Bash é essencial para a automação em DevOps.

Exemplo 1: Script de Backup

#!/bin/bash

# Script de backup do banco de dados com rotação
set -e  # Sair em caso de erro
set -u  # Sair em caso de variável indefinida

# Configuração
DB_NAME="myapp"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
LOG_FILE="/var/log/mysql_backup.log"

# Função para registrar mensagens
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Função para enviar notificação
send_notification() {
    local status=$1
    local message=$2
    
    # Enviar para o Slack
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# Criar diretório de backup se não existir
mkdir -p "$BACKUP_DIR"

# Iniciar backup
log "Iniciando backup do banco de dados: $DB_NAME"

# Realizar backup
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "Backup concluído com sucesso: $BACKUP_FILE"
    
    # Obter o tamanho do arquivo
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "Tamanho do backup: $SIZE"
    
    # Remover backups antigos
    log "Removendo backups com mais de $RETENTION_DAYS dias"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # Enviar para o S3 (opcional)
    if command -v aws &> /dev/null; then
        log "Enviando backup para o S3"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "Banco de dados $DB_NAME com backup feito com sucesso ($SIZE)"
else
    log "ERRO: Backup falhou"
    send_notification "FAILED" "Backup do banco de dados $DB_NAME falhou"
    exit 1
fi

log "Processo de backup concluído"

Exemplo 2: Script de Verificação de Saúde

#!/bin/bash

# Script de verificação de saúde do serviço
SERVICES=("nginx" "mysql" "redis")
ENDPOINTS=("http://localhost:80" "http://localhost:8080/health")
ALERT_EMAIL="[email protected]"

check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "✓ $service está em execução"
        return 0
    else
        echo "✗ $service NÃO está em execução"
        return 1
    fi
}

check_endpoint() {
    local url=$1
    local response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
    
    if [ "$response" -eq 200 ]; then
        echo "✓ $url está saudável (HTTP $response)"
        return 0
    else
        echo "✗ $url não está saudável (HTTP $response)"
        return 1
    fi
}

check_disk_space() {
    local threshold=80
    local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$usage" -lt "$threshold" ]; then
        echo "✓ Uso do disco: ${usage}%"
        return 0
    else
        echo "✗ Uso do disco crítico: ${usage}%"
        return 1
    fi
}

# Verificação de saúde principal
echo "=== Verificação de Saúde do Sistema ==="
echo "Data: $(date)"
echo

failed_checks=0

# Verificar serviços
echo "Verificando serviços..."
for service in "${SERVICES[@]}"; do
    if ! check_service
Newsletter subscription

Dicas de carreira semanais que realmente funcionam

Receba as últimas ideias diretamente na sua caixa de entrada

Sua Próxima Entrevista Está a Apenas um Currículo de Distância

Crie um currículo profissional e otimizado em minutos. Não são necessárias habilidades de design—apenas resultados comprovados.

Criar meu currículo

Compartilhar esta publicação

Seja Contratado 50% Mais Rápido

Candidatos que usam currículos profissionais aprimorados por IA conseguem vagas em uma média de 5 semanas comparado às 10 padrão. Pare de esperar e comece a fazer entrevistas.