diciembre 21, 2025
19 min de lectura

Preguntas para Entrevistas de Ingeniero DevOps Junior: Guía Completa

interview
career-advice
job-search
entry-level
Preguntas para Entrevistas de Ingeniero DevOps Junior: Guía Completa
MB

Milad Bonakdar

Autor

Domina los fundamentos esenciales de DevOps con preguntas de entrevista exhaustivas que cubren Linux, Git, CI/CD, Docker, conceptos básicos de la nube e Infraestructura como Código para ingenieros DevOps junior.


Introducción

La ingeniería de DevOps tiende puentes entre el desarrollo y las operaciones, centrándose en la automatización, la colaboración y la mejora continua. Como ingeniero de DevOps junior, necesitarás conocimientos básicos de Linux, control de versiones, pipelines de CI/CD, la contenerización y plataformas en la nube.

Esta guía cubre las preguntas esenciales para una entrevista de ingeniero de DevOps junior, organizadas por temas para ayudarte a prepararte eficazmente. Cada pregunta incluye respuestas detalladas, ejemplos prácticos y fragmentos de código prácticos.


Fundamentos de Linux

1. Explica los comandos comunes de Linux que usas a diario como ingeniero de DevOps.

Respuesta: Comandos esenciales de Linux para el trabajo de DevOps:

# Operaciones con archivos
ls -la                    # Listar archivos con detalles
cd /var/log              # Cambiar de directorio
cat /etc/hosts           # Mostrar el contenido del archivo
tail -f /var/log/app.log # Seguir el archivo de registro en tiempo real
grep "error" app.log     # Buscar patrones

# Gestión de procesos
ps aux | grep nginx      # Listar procesos
top                      # Supervisar los recursos del sistema
kill -9 1234            # Forzar la finalización del proceso
systemctl status nginx   # Comprobar el estado del servicio
systemctl restart nginx  # Reiniciar el servicio

# Permisos de archivo
chmod 755 script.sh      # Cambiar los permisos del archivo
chown user:group file    # Cambiar la propiedad
ls -l                    # Ver permisos

# Uso del disco
df -h                    # Uso del espacio en disco
du -sh /var/log          # Tamaño del directorio
free -h                  # Uso de la memoria

# Red
netstat -tulpn           # Mostrar los puertos de escucha
curl https://api.com     # Hacer una petición HTTP
ping google.com          # Probar la conectividad
ssh user@server          # Inicio de sesión remoto

Frecuencia: Muy común Dificultad: Fácil


2. ¿Cómo solucionarías un servicio que no se inicia en Linux?

Respuesta: Enfoque sistemático para la resolución de problemas:

# 1. Comprobar el estado del servicio
systemctl status nginx
# Buscar mensajes de error

# 2. Comprobar los registros
journalctl -u nginx -n 50
# o
tail -f /var/log/nginx/error.log

# 3. Comprobar la sintaxis de la configuración
nginx -t

# 4. Comprobar si el puerto ya está en uso
netstat -tulpn | grep :80
# o
lsof -i :80

# 5. Comprobar los permisos de los archivos
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. Comprobar el espacio en disco
df -h

# 7. Intentar iniciar manualmente para obtener más detalles
nginx -g 'daemon off;'

# 8. Comprobar SELinux/AppArmor (si está habilitado)
getenforce
ausearch -m avc -ts recent

Problemas comunes:

  • Errores de sintaxis de configuración
  • Puerto ya en uso
  • Permiso denegado
  • Dependencias faltantes
  • Espacio en disco insuficiente

Frecuencia: Muy común Dificultad: Media


Control de versiones con Git

3. Explica el flujo de trabajo básico de Git y los comandos comunes.

Respuesta: Flujo de trabajo de Git para las tareas diarias de DevOps:

# Inicializar el repositorio
git init
git clone https://github.com/user/repo.git

# Comprobar el estado
git status
git log --oneline

# Flujo de trabajo básico
git add .                    # Preparar los cambios
git commit -m "Añadir función"  # Confirmar los cambios
git push origin main         # Enviar al repositorio remoto

# Ramificación
git branch feature-x         # Crear rama
git checkout feature-x       # Cambiar de rama
git checkout -b feature-y    # Crear y cambiar

# Fusión
git checkout main
git merge feature-x

# Obtener los últimos cambios
git pull origin main

# Deshacer los cambios
git reset --hard HEAD        # Descartar los cambios locales
git revert abc123           # Revertir la confirmación específica

# Guardar los cambios
git stash                    # Guardar los cambios temporalmente
git stash pop               # Restaurar los cambios guardados

# Ver las diferencias
git diff                     # Cambios no preparados
git diff --staged           # Cambios preparados

Buenas prácticas:

  • Escribir mensajes de confirmación claros
  • Confirmar a menudo, enviar regularmente
  • Usar ramas de características
  • Obtener antes de enviar
  • Revisar los cambios antes de confirmar

Frecuencia: Muy común Dificultad: Fácil


4. ¿Cómo resuelves un conflicto de fusión en Git?

Respuesta: Resolución de conflictos paso a paso:

# 1. Intentar la fusión
git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 2. Comprobar los archivos en conflicto
git status
# Unmerged paths:
#   both modified:   file.txt

# 3. Abrir el archivo en conflicto
cat file.txt
# <<<<<<< HEAD
# Contenido de la rama actual
# =======
# Contenido de la rama entrante
# >>>>>>> feature-branch

# 4. Editar el archivo para resolver el conflicto
# Eliminar los marcadores de conflicto y mantener los cambios deseados

# 5. Preparar el archivo resuelto
git add file.txt

# 6. Completar la fusión
git commit -m "Resolver conflicto de fusión"

# Alternativa: abortar la fusión
git merge --abort

Marcadores de conflicto:

  • <<<<<<< HEAD - Tu rama actual
  • ======= - Separador
  • >>>>>>> branch-name - Cambios entrantes

Frecuencia: Común Dificultad: Fácil-Media


Fundamentos de CI/CD

5. ¿Qué es CI/CD y por qué es importante?

Respuesta: CI/CD significa Integración Continua y Despliegue/Entrega Continua.

Integración Continua (CI):

  • Construir y probar automáticamente el código en cada confirmación
  • Detectar los errores al principio
  • Asegurarse de que el código se integra correctamente

Despliegue Continuo (CD):

  • Desplegar automáticamente en producción después de que las pruebas pasen
  • Ciclos de lanzamiento más rápidos
  • Reducción de los errores manuales
Loading diagram...

Beneficios:

  • Bucles de retroalimentación más rápidos
  • Reducción de los problemas de integración
  • Pruebas automatizadas
  • Despliegues consistentes
  • Tiempo de comercialización más rápido

Frecuencia: Muy común Dificultad: Fácil


6. Explica un pipeline de CI/CD básico usando GitHub Actions.

Respuesta: Ejemplo de flujo de trabajo de GitHub Actions:

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

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

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Run tests
      run: npm test
    
    - name: Build application
      run: npm run build
    
    - name: Run linter
      run: npm run lint

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Deploy to production
      run: |
        echo "Deploying to production..."
        # Add deployment commands here

Conceptos clave:

  • Disparadores: Cuándo se ejecuta el pipeline (push, PR, programación)
  • Trabajos: Tareas independientes que pueden ejecutarse en paralelo
  • Pasos: Comandos individuales dentro de un trabajo
  • Artefactos: Archivos pasados entre trabajos

Frecuencia: Muy común Dificultad: Media


Docker y Contenerización

7. ¿Qué es Docker y por qué usamos contenedores?

Respuesta: Docker es una plataforma para desarrollar, enviar y ejecutar aplicaciones en contenedores.

Contenedores vs VMs:

  • Los contenedores comparten el kernel del sistema operativo del host (ligero)
  • Las VMs incluyen un sistema operativo completo (pesado)
  • Los contenedores se inician en segundos
  • Mejor utilización de los recursos

Beneficios:

  • Consistencia: El mismo entorno en todas partes
  • Aislamiento: Las aplicaciones no interfieren
  • Portabilidad: Ejecutar en cualquier lugar
  • Eficiencia: Ligero y rápido
# Ejemplo de Dockerfile
FROM node:18-alpine

WORKDIR /app

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

COPY . .

EXPOSE 3000

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

Frecuencia: Muy común Dificultad: Fácil


8. Explica los comandos comunes de Docker.

Respuesta: Comandos esenciales de Docker:

# Imágenes
docker pull nginx:latest          # Descargar imagen
docker images                     # Listar imágenes
docker rmi nginx:latest          # Eliminar imagen
docker build -t myapp:1.0 .      # Construir imagen

# Contenedores
docker run -d -p 80:80 nginx     # Ejecutar contenedor
docker ps                         # Listar los contenedores en ejecución
docker ps -a                      # Listar todos los contenedores
docker stop container_id          # Detener el contenedor
docker start container_id         # Iniciar el contenedor
docker restart container_id       # Reiniciar el contenedor
docker rm container_id            # Eliminar el contenedor

# Registros y depuración
docker logs container_id          # Ver los registros
docker logs -f container_id       # Seguir los registros
docker exec -it container_id bash # Entrar en el contenedor
docker inspect container_id       # Información detallada

# Limpieza
docker system prune              # Eliminar datos no utilizados
docker volume prune              # Eliminar volúmenes no utilizados

# Docker Compose
docker-compose up -d             # Iniciar servicios
docker-compose down              # Detener servicios
docker-compose logs -f           # Ver los registros

Frecuencia: Muy común Dificultad: Fácil


9. Escribe un docker-compose.yml para una aplicación web con una base de datos.

Respuesta: Ejemplo de aplicación multi-contenedor:

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:

Conceptos clave:

  • services: Definir contenedores
  • depends_on: Dependencias del servicio
  • volumes: Almacenamiento de datos persistente
  • environment: Variables de entorno
  • ports: Mapeo de puertos
  • restart: Política de reinicio

Frecuencia: Común Dificultad: Media


Fundamentos de la nube

10. Explica la diferencia entre IaaS, PaaS y SaaS.

Respuesta: Modelos de servicio en la nube:

IaaS (Infraestructura como Servicio):

  • Proporciona: Máquinas virtuales, almacenamiento, redes
  • Usted gestiona: SO, tiempo de ejecución, aplicaciones
  • Ejemplos: AWS EC2, Azure VMs, Google Compute Engine
  • Caso de uso: Control total sobre la infraestructura

PaaS (Plataforma como Servicio):

  • Proporciona: Entorno de tiempo de ejecución, bases de datos, middleware
  • Usted gestiona: Aplicaciones y datos
  • Ejemplos: AWS Elastic Beanstalk, Heroku, Google App Engine
  • Caso de uso: Centrarse en el código, no en la infraestructura

SaaS (Software como Servicio):

  • Proporciona: Aplicaciones completas
  • Usted gestiona: Datos y configuración del usuario
  • Ejemplos: Gmail, Salesforce, Office 365
  • Caso de uso: Aplicaciones listas para usar
Loading diagram...

Frecuencia: Común Dificultad: Fácil


11. ¿Cuáles son los servicios básicos de AWS que debe conocer un ingeniero de DevOps?

Respuesta: Servicios esenciales de AWS:

Compute:

  • EC2: Servidores virtuales
  • Lambda: Funciones sin servidor
  • ECS/EKS: Orquestación de contenedores

Storage:

  • S3: Almacenamiento de objetos
  • EBS: Almacenamiento en bloque para EC2
  • EFS: Almacenamiento de archivos compartidos

Networking:

  • VPC: Nube privada virtual
  • Route 53: Servicio DNS
  • CloudFront: CDN
  • ELB: Balanceo de carga

Database:

  • RDS: Bases de datos relacionales gestionadas
  • DynamoDB: Base de datos NoSQL

DevOps Tools:

  • CodePipeline: Servicio de CI/CD
  • CodeBuild: Servicio de construcción
  • CloudWatch: Monitorización y registro
  • IAM: Gestión de acceso

Ejemplo: Lanzar una instancia EC2 con 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}]'

Frecuencia: Muy común Dificultad: Media


Infraestructura como código

12. ¿Qué es la infraestructura como código (IaC) y por qué es importante?

Respuesta: IaC es la gestión de la infraestructura a través del código en lugar de los procesos manuales.

Beneficios:

  • Control de versiones: Rastrear los cambios en la infraestructura
  • Reproducibilidad: Crear entornos idénticos
  • Automatización: Reducir los errores manuales
  • Documentación: El código sirve como documentación
  • Consistencia: La misma configuración en todas partes

Herramientas populares de IaC:

  • Terraform: Aprovisionamiento multi-nube
  • Ansible: Gestión de la configuración
  • CloudFormation: Específico de AWS
  • Pulumi: IaC basada en código

Ejemplo de 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"]
  }
}

Frecuencia: Muy común Dificultad: Media


13. Explica el flujo de trabajo básico de Terraform.

Respuesta: Pasos del flujo de trabajo de Terraform:

# 1. Inicializar Terraform
terraform init
# Descarga los proveedores y los módulos

# 2. Formatear el código
terraform fmt
# Formatea los archivos .tf

# 3. Validar la configuración
terraform validate
# Comprueba la sintaxis

# 4. Planificar los cambios
terraform plan
# Muestra lo que se creará/modificará/destruirá

# 5. Aplicar los cambios
terraform apply
# Crea/actualiza la infraestructura
# Pide confirmación

# 6. Ver el estado
terraform show
# Muestra el estado actual

# 7. Destruir la infraestructura
terraform destroy
# Elimina todos los recursos

Estructura de archivos de Terraform:

project/
├── main.tf          # Configuración principal
├── variables.tf     # Variables de entrada
├── outputs.tf       # Valores de salida
├── terraform.tfvars # Valores de las variables
└── .terraform/      # Plugins del proveedor

Ejemplo de variables:

# variables.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "Environment name"
  type        = string
}

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

Frecuencia: Común Dificultad: Media


Monitorización y registro

14. ¿Qué métricas monitorizarías para una aplicación web?

Respuesta: Métricas clave de monitorización:

Métricas de la aplicación:

  • Tiempo de respuesta / latencia
  • Tasa de peticiones (peticiones por segundo)
  • Tasa de errores (errores 4xx, 5xx)
  • Rendimiento

Métricas del sistema:

  • Uso de la CPU
  • Uso de la memoria
  • E/S del disco
  • E/S de la red

Métricas de la infraestructura:

  • Estado del contenedor/pod
  • Disponibilidad del servicio
  • Estado del balanceador de carga

Ejemplo de consulta Prometheus:

# Tiempo de respuesta promedio
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

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

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

Umbrales de alerta:

  • Tiempo de respuesta > 500ms
  • Tasa de error > 1%
  • Uso de la CPU > 80%
  • Uso de la memoria > 85%
  • Uso del disco > 90%

Frecuencia: Común Dificultad: Media


15. ¿Cómo centralizas los registros de varios servidores?

Respuesta: Arquitectura de registro centralizado:

Loading diagram...

Pila común (ELK):

  • Elasticsearch: Almacenar e indexar los registros
  • Logstash/Fluentd: Recoger y procesar los registros
  • Kibana: Visualizar y buscar los registros

Ejemplo de configuración de 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: ~

Buenas prácticas:

  • Usar el registro estructurado (JSON)
  • Incluir los ID de correlación
  • Establecer políticas de retención
  • Indexar estratégicamente
  • Supervisar el volumen de registros

Frecuencia: Común Dificultad: Media


Fundamentos de Kubernetes

16. ¿Qué es Kubernetes y cuáles son sus componentes básicos?

Respuesta: Kubernetes es una plataforma de orquestación de contenedores que automatiza el despliegue, el escalado y la gestión de aplicaciones contenerizadas.

Componentes básicos:

Plano de control:

  • Servidor API: Punto de entrada para todos los comandos
  • etcd: Almacén de clave-valor para los datos del clúster
  • Planificador: Asigna los pods a los nodos
  • Gestor de controladores: Mantiene el estado deseado

Nodos de trabajo:

  • kubelet: Gestiona los pods en el nodo
  • kube-proxy: Enrutamiento de la red
  • Tiempo de ejecución del contenedor: Ejecuta los contenedores (Docker, containerd)
Loading diagram...

Objetos básicos de 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. Despliegue:

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. Servicio:

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

Comandos comunes de kubectl:

# Obtener recursos
kubectl get pods
kubectl get deployments
kubectl get services

# Describir el recurso
kubectl describe pod nginx-pod

# Crear desde el archivo
kubectl apply -f deployment.yaml

# Eliminar el recurso
kubectl delete pod nginx-pod

# Ver los registros
kubectl logs nginx-pod

# Ejecutar el comando en el pod
kubectl exec -it nginx-pod -- /bin/bash

# Reenvío de puertos
kubectl port-forward pod/nginx-pod 8080:80

Frecuencia: Muy común Dificultad: Fácil


Gestión de la configuración

17. Explica los fundamentos de Ansible y escribe un playbook sencillo.

Respuesta: Ansible es una herramienta de gestión de la configuración sin agente que utiliza SSH para configurar los servidores.

Conceptos clave:

  • Inventario: Lista de servidores a gestionar
  • Playbook: Archivo YAML que define las tareas
  • Módulos: Unidades de trabajo reutilizables
  • Roles: Colección organizada de tareas

Archivo de inventario:

# 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 sencillo:

# playbook.yml
---
- name: Configurar servidores web
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: Actualizar la caché de apt
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: Instalar los paquetes necesarios
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: Crear usuario de aplicación
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: Copiar la configuración de nginx
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Reiniciar nginx
    
    - name: Asegurarse de que nginx se está ejecutando
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: Desplegar la aplicación
      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

Ejemplo de plantilla:

# 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;
    }
}

Ejecutar playbooks:

# Comprobar la sintaxis
ansible-playbook playbook.yml --syntax-check

# Ejecución en seco (modo de comprobación)
ansible-playbook playbook.yml --check

# Ejecutar el playbook
ansible-playbook -i inventory.ini playbook.yml

# Ejecutar con etiquetas específicas
ansible-playbook playbook.yml --tags "deploy"

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

Estructura de los roles de Ansible:

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

Usar roles:

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

Comandos ad-hoc:

# Hacer ping a todos los hosts
ansible all -i inventory.ini -m ping

# Ejecutar el comando en todos los hosts
ansible all -i inventory.ini -a "uptime"

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

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

# Reiniciar el servicio
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

Frecuencia: Común Dificultad: Media


Scripting y automatización

18. Escribe un script bash para automatizar una tarea común de DevOps.

Respuesta: Los scripts Bash son esenciales para la automatización en DevOps.

Ejemplo 1: Script de copia de seguridad

#!/bin/bash

# Script de copia de seguridad de la base de datos con rotación
set -e  # Salir si hay un error
set -u  # Salir si la variable no está definida

# Configuración
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"

# Función para registrar mensajes
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Función para enviar la notificación
send_notification() {
    local status=$1
    local message=$2
    
    # Enviar a Slack
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# Crear el directorio de copia de seguridad si no existe
mkdir -p "$BACKUP_DIR"

# Iniciar la copia de seguridad
log "Iniciando la copia de seguridad de la base de datos: $DB_NAME"

# Realizar la copia de seguridad
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "Copia de seguridad completada con éxito: $BACKUP_FILE"
    
    # Obtener el tamaño del archivo
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "Tamaño de la copia de seguridad: $SIZE"
    
    # Eliminar las copias de seguridad antiguas
    log "Eliminando las copias de seguridad más antiguas de $RETENTION_DAYS días"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # Subir a S3 (opcional)
    if command -v aws &> /dev/null; then
        log "Subiendo la copia de seguridad a S3"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "Base de datos $DB_NAME copiada con éxito ($SIZE)"
else
    log "ERROR: Falló la copia de seguridad"
    send_notification "FAILED" "Falló la copia de seguridad de la base de datos $DB_NAME"
    exit 1
fi

log "Proceso de copia de seguridad completado"

Ejemplo 2: Script de comprobación del estado

#!/bin/bash

# Script de comprobación del estado del servicio
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 se está ejecutando"
        return 0
    else
        echo "✗ $service NO se está ejecutando"
        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á sano (HTTP $response)"
        return 0
    else
        echo "✗ $url no está sano (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 del disco: ${usage}%"
        return 0
    else
        echo "✗ Uso del disco crítico: ${usage}%"
        return 1
    fi
}

# Comprobación de estado principal
echo "=== Comprobación del estado del sistema ==="
echo "Fecha: $(date)"
echo

failed_checks=0

# Comprobar los servicios
echo "Comprobando los
Newsletter subscription

Consejos de carrera semanales que realmente funcionan

Recibe las últimas ideas directamente en tu bandeja de entrada

Decorative doodle

Destácate ante los Reclutadores y Consigue el Trabajo de Tus Sueños

Únete a miles que transformaron sus carreras con currículums impulsados por IA que pasan el ATS e impresionan a los gerentes de contratación.

Comienza a crear ahora

Compartir esta publicación

Supera la Tasa de Rechazo del 75% de los ATS

3 de cada 4 currículums nunca llegan a un ojo humano. Nuestra optimización de palabras clave aumenta tu tasa de aprobación hasta en un 80%, asegurando que los reclutadores realmente vean tu potencial.