# 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`:

```jinja
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`:

```jinja
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`:

```yaml
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`

```yaml
- 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:

```yaml
- 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:

```yaml
db_password: "SuperSegreta123"
api_key: "XYZ987654321"
```

Utilizzo nel template:

```jinja
DB_PASSWORD={{ db_password }}
API_KEY={{ api_key }}
```

Esecuzione playbook con Vault:

```bash
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