Skip to main content

Capitolo 8 – Deploy Applicativo e Template Jinja2

Dopo aver appreso ruoli, variabili e gestione dei segreti, il passo successivo è imparare a deployare applicazioni in modo automatizzato e a utilizzare template Jinja2 per configurazioni dinamiche.


8.1 Cos’è un Template Jinja2

I template Jinja2 permettono di creare file di configurazione dinamici.

Caratteristiche principali:

  • Sintassi semplice simile a Python
  • Variabili sostituite al momento dell’esecuzione
  • Supporto per cicli, condizioni e filtri
  • Ideale per configurazioni come nginx, apache, systemd, ecc.

Esempio minimo di template nginx.conf.j2:

server {
    listen {{ http_port }};
    server_name {{ server_name }};

    root {{ web_root }};
    index index.html;
}

8.2 Creazione di un Template per il Web Server

Esempio ruolo roles/nginx/templates/nginx.conf.j2:

user www-data;
worker_processes auto;

pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    server {
        listen {{ http_port }};
        server_name {{ server_name }};
        root {{ web_root }};
        index index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

Variabili tipiche da definire in group_vars/web.yml:

http_port: 80
server_name: example.com
web_root: /var/www/html

8.3 Copiare Template con il Modulo template

Playbook esempio: playbooks/deploy_web.yml

- name: Deploy Web Server
  hosts: web
  become: true

  roles:
    - nginx

  tasks:
    - name: Deploy configurazione nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/sites-available/default
        owner: root
        group: root
        mode: '0644'

    - name: Riavvia nginx se configurazione cambiata
      service:
        name: nginx
        state: restarted
      when: ansible_os_family == "Debian"

8.4 Gestione Deploy Applicativo Completo

Oltre al web server, un deploy tipico include:

  • Creazione cartella applicazione
  • Copia codice (modulo git o copy)
  • Gestione dipendenze (es. pip, npm, apt)
  • Configurazione variabili ambiente
  • Avvio servizi (es. systemd o docker)

Esempio snippet per copia codice:

- name: Clona repository applicativo
  git:
    repo: 'https://github.com/tuo-progetto/app.git'
    dest: /var/www/html
    version: main

8.5 Gestione Segreti nel Deploy

Variabili sensibili (API key, password DB) mai hardcodate.

Esempio group_vars/web/secrets.yml cifrato con Vault:

db_password: "SuperSegreta123"
api_key: "XYZ987654321"

Utilizzo nel template:

DB_PASSWORD={{ db_password }}
API_KEY={{ api_key }}

Esecuzione playbook con Vault:

ansible-playbook playbooks/deploy_web.yml --ask-vault-pass

8.6 Best Practice per Deploy

  • Creare ruoli per ogni componente (nginx, app, db)
  • Usare template per tutte le configurazioni modificabili
  • Separare variabili di ambiente da variabili di default
  • Testare sempre con --check prima di eseguire in produzione
  • Versionare codice e playbook su Git
  • Automatizzare restart servizi solo se necessario (notify e handlers)

8.7 Conclusione

L’utilizzo di template Jinja2 e playbook modulare permette di:

  • Standardizzare deploy
  • Rendere configurazioni dinamiche e riutilizzabili
  • Gestire segreti in sicurezza
  • Automatizzare tutte le operazioni di setup applicativo

Nei prossimi capitoli si può approfondire:

  • Hardening e sicurezza server
  • Logging e troubleshooting avanzato
  • Deploy multi-tier e orchestrazione