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
Milad Bonakdar

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

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.