dicembre 21, 2025
18 min di lettura

Domande per il Colloquio da Junior DevOps Engineer: Guida Completa

interview
career-advice
job-search
entry-level
Domande per il Colloquio da Junior DevOps Engineer: Guida Completa
MB

Milad Bonakdar

Autore

Padroneggia i fondamenti essenziali di DevOps con domande complete per il colloquio che coprono Linux, Git, CI/CD, Docker, le basi del cloud e Infrastructure as Code per junior DevOps engineer.


Introduzione

L'ingegneria DevOps fa da ponte tra sviluppo e operazioni, concentrandosi su automazione, collaborazione e miglioramento continuo. Come junior DevOps engineer, avrai bisogno di una conoscenza di base di Linux, version control, pipeline CI/CD, containerizzazione e piattaforme cloud.

Questa guida tratta le domande essenziali per un colloquio da junior DevOps engineer, organizzate per argomento per aiutarti a prepararti in modo efficace. Ogni domanda include risposte dettagliate, esempi pratici e snippet di codice pratici.


Fondamenti di Linux

1. Spiega i comandi Linux comuni che usi quotidianamente come DevOps engineer.

Risposta: Comandi Linux essenziali per il lavoro DevOps:

# Operazioni sui file
ls -la                    # Elenca i file con i dettagli
cd /var/log              # Cambia directory
cat /etc/hosts           # Visualizza il contenuto del file
tail -f /var/log/app.log # Segui il file di log in tempo reale
grep "error" app.log     # Cerca modelli

# Gestione dei processi
ps aux | grep nginx      # Elenca i processi
top                      # Monitora le risorse di sistema
kill -9 1234            # Forza l'interruzione del processo
systemctl status nginx   # Controlla lo stato del servizio
systemctl restart nginx  # Riavvia il servizio

# Permessi sui file
chmod 755 script.sh      # Modifica i permessi del file
chown user:group file    # Modifica la proprietà
ls -l                    # Visualizza i permessi

# Utilizzo del disco
df -h                    # Utilizzo dello spazio su disco
du -sh /var/log          # Dimensione della directory
free -h                  # Utilizzo della memoria

# Rete
netstat -tulpn           # Mostra le porte in ascolto
curl https://api.com     # Effettua una richiesta HTTP
ping google.com          # Testa la connettività
ssh user@server          # Login remoto

Rarità: Molto comune Difficoltà: Facile


2. Come risolvi i problemi di un servizio che non si avvia su Linux?

Risposta: Approccio sistematico alla risoluzione dei problemi:

# 1. Controlla lo stato del servizio
systemctl status nginx
# Cerca messaggi di errore

# 2. Controlla i log
journalctl -u nginx -n 50
# oppure
tail -f /var/log/nginx/error.log

# 3. Controlla la sintassi della configurazione
nginx -t

# 4. Controlla se la porta è già in uso
netstat -tulpn | grep :80
# oppure
lsof -i :80

# 5. Controlla i permessi dei file
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. Controlla lo spazio su disco
df -h

# 7. Prova ad avviare manualmente per maggiori dettagli
nginx -g 'daemon off;'

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

Problemi comuni:

  • Errori di sintassi nella configurazione
  • Porta già in uso
  • Permesso negato
  • Dipendenze mancanti
  • Spazio su disco insufficiente

Rarità: Molto comune Difficoltà: Media


Controllo della versione con Git

3. Spiega il flusso di lavoro Git di base e i comandi comuni.

Risposta: Flusso di lavoro Git per le attività DevOps quotidiane:

# Inizializza il repository
git init
git clone https://github.com/user/repo.git

# Controlla lo stato
git status
git log --oneline

# Flusso di lavoro di base
git add .                    # Prepara le modifiche
git commit -m "Add feature"  # Esegue il commit delle modifiche
git push origin main         # Invia al repository remoto

# Branching
git branch feature-x         # Crea un branch
git checkout feature-x       # Cambia branch
git checkout -b feature-y    # Crea e cambia

# Unione
git checkout main
git merge feature-x

# Scarica le ultime modifiche
git pull origin main

# Annulla le modifiche
git reset --hard HEAD        # Scarta le modifiche locali
git revert abc123           # Ripristina uno specifico commit

# Accantona le modifiche
git stash                    # Salva temporaneamente le modifiche
git stash pop               # Ripristina le modifiche accantonate

# Visualizza le differenze
git diff                     # Modifiche non preparate
git diff --staged           # Modifiche preparate

Best practice:

  • Scrivi messaggi di commit chiari
  • Esegui il commit spesso, invia regolarmente
  • Usa i branch di feature
  • Scarica prima di inviare
  • Rivedi le modifiche prima di eseguire il commit

Rarità: Molto comune Difficoltà: Facile


4. Come risolvi un conflitto di merge in Git?

Risposta: Risoluzione dei conflitti passo dopo passo:

# 1. Tenta l'unione
git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 2. Controlla i file in conflitto
git status
# Unmerged paths:
#   both modified:   file.txt

# 3. Apri il file in conflitto
cat file.txt
# <<<<<<< HEAD
# Contenuto del branch corrente
# =======
# Contenuto del branch in arrivo
# >>>>>>> feature-branch

# 4. Modifica il file per risolvere il conflitto
# Rimuovi i marcatori di conflitto e mantieni le modifiche desiderate

# 5. Prepara il file risolto
git add file.txt

# 6. Completa l'unione
git commit -m "Resolve merge conflict"

# Alternativa: Interrompi l'unione
git merge --abort

Marcatori di conflitto:

  • <<<<<<< HEAD - Il tuo branch corrente
  • ======= - Separatore
  • >>>>>>> branch-name - Modifiche in arrivo

Rarità: Comune Difficoltà: Facile-Media


Nozioni di base su CI/CD

5. Cos'è CI/CD e perché è importante?

Risposta: CI/CD sta per Continuous Integration e Continuous Deployment/Delivery.

Continuous Integration (CI):

  • Compila e testa automaticamente il codice a ogni commit
  • Individua i bug in anticipo
  • Assicura che il codice si integri correttamente

Continuous Deployment (CD):

  • Distribuisci automaticamente in produzione dopo che i test sono superati
  • Cicli di rilascio più rapidi
  • Riduzione degli errori manuali
Loading diagram...

Vantaggi:

  • Cicli di feedback più rapidi
  • Riduzione dei problemi di integrazione
  • Test automatizzati
  • Distribuzioni coerenti
  • Time-to-market più rapido

Rarità: Molto comune Difficoltà: Facile


6. Spiega una pipeline CI/CD di base usando GitHub Actions.

Risposta: Esempio di workflow di GitHub Actions:

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

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..."
        # Aggiungi qui i comandi di distribuzione

Concetti chiave:

  • Trigger: Quando viene eseguita la pipeline (push, PR, pianificazione)
  • Jobs: Attività indipendenti che possono essere eseguite in parallelo
  • Steps: Singoli comandi all'interno di un job
  • Artifacts: File passati tra i job

Rarità: Molto comune Difficoltà: Media


Docker e containerizzazione

7. Cos'è Docker e perché usiamo i container?

Risposta: Docker è una piattaforma per sviluppare, spedire ed eseguire applicazioni in container.

Container vs VM:

  • I container condividono il kernel del sistema operativo host (leggero)
  • Le VM includono un sistema operativo completo (pesante)
  • I container si avviano in pochi secondi
  • Migliore utilizzo delle risorse

Vantaggi:

  • Coerenza: Stesso ambiente ovunque
  • Isolamento: Le app non interferiscono
  • Portabilità: Esegui ovunque
  • Efficienza: Leggero e veloce
# Esempio di Dockerfile
FROM node:18-alpine

WORKDIR /app

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

COPY . .

EXPOSE 3000

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

Rarità: Molto comune Difficoltà: Facile


8. Spiega i comandi Docker comuni.

Risposta: Comandi Docker essenziali:

# Immagini
docker pull nginx:latest          # Scarica l'immagine
docker images                     # Elenca le immagini
docker rmi nginx:latest          # Rimuovi l'immagine
docker build -t myapp:1.0 .      # Costruisci l'immagine

# Container
docker run -d -p 80:80 nginx     # Esegui il container
docker ps                         # Elenca i container in esecuzione
docker ps -a                      # Elenca tutti i container
docker stop container_id          # Arresta il container
docker start container_id         # Avvia il container
docker restart container_id       # Riavvia il container
docker rm container_id            # Rimuovi il container

# Log e debug
docker logs container_id          # Visualizza i log
docker logs -f container_id       # Segui i log
docker exec -it container_id bash # Entra nel container
docker inspect container_id       # Informazioni dettagliate

# Pulizia
docker system prune              # Rimuovi i dati inutilizzati
docker volume prune              # Rimuovi i volumi inutilizzati

# Docker Compose
docker-compose up -d             # Avvia i servizi
docker-compose down              # Arresta i servizi
docker-compose logs -f           # Visualizza i log

Rarità: Molto comune Difficoltà: Facile


9. Scrivi un docker-compose.yml per un'applicazione web con un database.

Risposta: Esempio di applicazione multi-container:

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:

Concetti chiave:

  • services: Definisci i container
  • depends_on: Dipendenze dei servizi
  • volumes: Archiviazione dati persistente
  • environment: Variabili d'ambiente
  • ports: Mappatura delle porte
  • restart: Politica di riavvio

Rarità: Comune Difficoltà: Media


Nozioni di base sul cloud

10. Spiega la differenza tra IaaS, PaaS e SaaS.

Risposta: Modelli di servizio cloud:

IaaS (Infrastructure as a Service):

  • Fornisce: Macchine virtuali, storage, reti
  • Gestisci: Sistema operativo, runtime, applicazioni
  • Esempi: AWS EC2, Azure VMs, Google Compute Engine
  • Caso d'uso: Controllo completo sull'infrastruttura

PaaS (Platform as a Service):

  • Fornisce: Ambiente di runtime, database, middleware
  • Gestisci: Applicazioni e dati
  • Esempi: AWS Elastic Beanstalk, Heroku, Google App Engine
  • Caso d'uso: Concentrati sul codice, non sull'infrastruttura

SaaS (Software as a Service):

  • Fornisce: Applicazioni complete
  • Gestisci: Dati e impostazioni dell'utente
  • Esempi: Gmail, Salesforce, Office 365
  • Caso d'uso: Applicazioni pronte all'uso
Loading diagram...

Rarità: Comune Difficoltà: Facile


11. Quali sono i servizi AWS di base che un DevOps engineer dovrebbe conoscere?

Risposta: Servizi AWS essenziali:

Calcolo:

  • EC2: Server virtuali
  • Lambda: Funzioni serverless
  • ECS/EKS: Orchestrazione di container

Archiviazione:

  • S3: Archiviazione di oggetti
  • EBS: Archiviazione a blocchi per EC2
  • EFS: Archiviazione di file condivisa

Rete:

  • VPC: Cloud privato virtuale
  • Route 53: Servizio DNS
  • CloudFront: CDN
  • ELB: Bilanciamento del carico

Database:

  • RDS: Database relazionali gestiti
  • DynamoDB: Database NoSQL

Strumenti DevOps:

  • CodePipeline: Servizio CI/CD
  • CodeBuild: Servizio di build
  • CloudWatch: Monitoraggio e registrazione
  • IAM: Gestione degli accessi

Esempio: Avvia un'istanza 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}]'

Rarità: Molto comune Difficoltà: Media


Infrastruttura come codice

12. Cos'è l'Infrastructure as Code (IaC) e perché è importante?

Risposta: IaC è la gestione dell'infrastruttura tramite codice anziché processi manuali.

Vantaggi:

  • Controllo della versione: Tieni traccia delle modifiche all'infrastruttura
  • Riproducibilità: Crea ambienti identici
  • Automazione: Riduci gli errori manuali
  • Documentazione: Il codice funge da documentazione
  • Coerenza: Stessa configurazione ovunque

Strumenti IaC popolari:

  • Terraform: Provisioning multi-cloud
  • Ansible: Gestione della configurazione
  • CloudFormation: Specifico per AWS
  • Pulumi: IaC basato su codice

Esempio 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"]
  }
}

Rarità: Molto comune Difficoltà: Media


13. Spiega il flusso di lavoro di base di Terraform.

Risposta: Passaggi del flusso di lavoro di Terraform:

# 1. Inizializza Terraform
terraform init
# Scarica provider e moduli

# 2. Formatta il codice
terraform fmt
# Formatta i file .tf

# 3. Valida la configurazione
terraform validate
# Controlla la sintassi

# 4. Pianifica le modifiche
terraform plan
# Mostra cosa verrà creato/modificato/distrutto

# 5. Applica le modifiche
terraform apply
# Crea/aggiorna l'infrastruttura
# Richiede conferma

# 6. Visualizza lo stato
terraform show
# Mostra lo stato corrente

# 7. Distruggi l'infrastruttura
terraform destroy
# Rimuove tutte le risorse

Struttura dei file di Terraform:

project/
├── main.tf          # Configurazione principale
├── variables.tf     # Variabili di input
├── outputs.tf       # Valori di output
├── terraform.tfvars # Valori delle variabili
└── .terraform/      # Plugin del provider

Esempio di variabili:

# 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"

Rarità: Comune Difficoltà: Media


Monitoraggio e registrazione

14. Quali metriche monitoreresti per un'applicazione web?

Risposta: Metriche di monitoraggio chiave:

Metriche dell'applicazione:

  • Tempo di risposta / latenza
  • Frequenza delle richieste (richieste al secondo)
  • Tasso di errore (errori 4xx, 5xx)
  • Throughput

Metriche di sistema:

  • Utilizzo della CPU
  • Utilizzo della memoria
  • I/O del disco
  • I/O di rete

Metriche dell'infrastruttura:

  • Stato del container/pod
  • Disponibilità del servizio
  • Integrità del load balancer

Esempio di query Prometheus:

# Tempo di risposta medio
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

# Tasso di errore
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

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

Soglie di avviso:

  • Tempo di risposta > 500ms
  • Tasso di errore > 1%
  • Utilizzo della CPU > 80%
  • Utilizzo della memoria > 85%
  • Utilizzo del disco > 90%

Rarità: Comune Difficoltà: Media


15. Come centralizzi i log da più server?

Risposta: Architettura di registrazione centralizzata:

Loading diagram...

Stack comune (ELK):

  • Elasticsearch: Archivia e indicizza i log
  • Logstash/Fluentd: Raccogli ed elabora i log
  • Kibana: Visualizza e cerca i log

Esempio di configurazione di 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: ~

Best practice:

  • Usa la registrazione strutturata (JSON)
  • Includi gli ID di correlazione
  • Imposta le politiche di conservazione
  • Indicizza strategicamente
  • Monitora il volume dei log

Rarità: Comune Difficoltà: Media


Nozioni di base su Kubernetes

16. Cos'è Kubernetes e quali sono i suoi componenti di base?

Risposta: Kubernetes è una piattaforma di orchestrazione di container che automatizza la distribuzione, il ridimensionamento e la gestione di applicazioni containerizzate.

Componenti di base:

Control Plane:

  • API Server: Punto di ingresso per tutti i comandi
  • etcd: Archivio chiave-valore per i dati del cluster
  • Scheduler: Assegna i pod ai nodi
  • Controller Manager: Mantiene lo stato desiderato

Worker Nodes:

  • kubelet: Gestisce i pod sul nodo
  • kube-proxy: Routing di rete
  • Container Runtime: Esegue i container (Docker, containerd)
Loading diagram...

Oggetti Kubernetes di base:

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

Comandi kubectl comuni:

# Ottieni le risorse
kubectl get pods
kubectl get deployments
kubectl get services

# Descrivi la risorsa
kubectl describe pod nginx-pod

# Crea dal file
kubectl apply -f deployment.yaml

# Elimina la risorsa
kubectl delete pod nginx-pod

# Visualizza i log
kubectl logs nginx-pod

# Esegui il comando nel pod
kubectl exec -it nginx-pod -- /bin/bash

# Port forwarding
kubectl port-forward pod/nginx-pod 8080:80

Rarità: Molto comune Difficoltà: Facile


Gestione della configurazione

17. Spiega le nozioni di base di Ansible e scrivi un playbook semplice.

Risposta: Ansible è uno strumento di gestione della configurazione senza agent che utilizza SSH per configurare i server.

Concetti chiave:

  • Inventory: Elenco dei server da gestire
  • Playbook: File YAML che definisce le attività
  • Modules: Unità di lavoro riutilizzabili
  • Roles: Raccolta organizzata di attività

Inventory File:

# 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

Simple Playbook:

# playbook.yml
---
- name: Setup Web Servers
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: Update apt cache
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: Install required packages
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: Create application user
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: Copy nginx configuration
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart nginx
    
    - name: Ensure nginx is running
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: Deploy application
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main
      become_user: "{{ app_user }}"
  
  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted

Template Example:

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

Running Playbooks:

# Check syntax
ansible-playbook playbook.yml --syntax-check

# Dry run (check mode)
ansible-playbook playbook.yml --check

# Run playbook
ansible-playbook -i inventory.ini playbook.yml

# Run with specific tags
ansible-playbook playbook.yml --tags "deploy"

# Limit to specific hosts
ansible-playbook playbook.yml --limit webservers

Ansible Roles Structure:

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

Using Roles:

---
- name: Setup Infrastructure
  hosts: all
  become: yes
  
  roles:
    - common
    - webserver
    - monitoring

Ad-hoc Commands:

# Ping all hosts
ansible all -i inventory.ini -m ping

# Run command on all hosts
ansible all -i inventory.ini -a "uptime"

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

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

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

Rarità: Comune Difficoltà: Media


Scripting e automazione

18. Scrivi uno script bash per automatizzare un'attività DevOps comune.

Risposta: Lo scripting Bash è essenziale per l'automazione in DevOps.

Esempio 1: Script di backup

#!/bin/bash

# Script di backup del database con rotazione
set -e  # Esci in caso di errore
set -u  # Esci in caso di variabile non definita

# Configurazione
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"

# Funzione per registrare i messaggi
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# Funzione per inviare la notifica
send_notification() {
    local status=$1
    local message=$2
    
    # Invia a Slack
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# Crea la directory di backup se non esiste
mkdir -p "$BACKUP_DIR"

# Avvia il backup
log "Avvio del backup del database: $DB_NAME"

# Esegui il backup
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "Backup completato con successo: $BACKUP_FILE"
    
    # Ottieni la dimensione del file
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "Dimensione del backup: $SIZE"
    
    # Rimuovi i vecchi backup
    log "Rimozione dei backup più vecchi di $RETENTION_DAYS giorni"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # Carica su S3 (opzionale)
    if command -v aws &> /dev/null; then
        log "Caricamento del backup su S3"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "Database $DB_NAME sottoposto a backup con successo ($SIZE)"
else
    log "ERRORE: Backup non riuscito"
    send_notification "FAILED" "Backup del database $DB_NAME non riuscito"
    exit 1
fi

log "Processo di backup completato"

Esempio 2: Script di controllo dello stato

#!/bin/bash

# Script di controllo dello stato del servizio
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 è in esecuzione"
        return 0
    else
        echo "✗ $service NON è in esecuzione"
        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 è integro (HTTP $response)"
        return 0
    else
        echo "✗ $url non è integro (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 "✓ Utilizzo del disco: ${usage}%"
        return 0
    else
        echo "✗ Utilizzo del disco critico: ${usage}%"
        return 1
    fi
}

# Controllo dello stato principale
echo "=== Controllo dello stato del sistema ==="
echo "Data: $(date)"
echo

failed_checks=0

# Controlla i servizi
echo "Controllo dei servizi..."
for service in "${SERVICES[@]}"; do
    if ! check_service "$
Newsletter subscription

Consigli di carriera settimanali che funzionano davvero

Ricevi le ultime idee direttamente nella tua casella di posta

Decorative doodle

Distinguiti dai Reclutatori e Ottieni il Lavoro dei Tuoi Sogni

Unisciti a migliaia di persone che hanno trasformato la loro carriera con curriculum potenziati dall'IA che superano l'ATS e impressionano i responsabili delle assunzioni.

Inizia a creare ora

Condividi questo post

Riduci il Tempo di Scrittura del Curriculum del 90%

La persona in cerca di lavoro media impiega più di 3 ore per formattare un curriculum. La nostra IA lo fa in meno di 15 minuti, portandoti alla fase di candidatura 12 volte più velocemente.

Domande per il Colloquio da Junior DevOps Engineer: Guida Completa | Minova - ATS Resume Builder