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.