# Capitolo 7 – Ruoli, Variabili e Gestione Segreti

Dopo aver imparato i playbook base, è fondamentale organizzare i progetti in modo modulare e sicuro.

---

## 7.1 Introduzione ai Ruoli

I **ruoli** permettono di raggruppare tasks, file, template e variabili in moduli riutilizzabili.

Struttura tipica di un ruolo `nginx`:

```
roles/
└── nginx/
    ├── tasks/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    ├── vars/
    │   └── main.yml
    ├── defaults/
    │   └── main.yml
    └── handlers/
        └── main.yml
```

- `tasks/main.yml` → definisce le azioni principali  
- `handlers/main.yml` → definisce azioni come restart servizi  
- `templates/` → file Jinja2 parametrizzati  
- `vars/` → variabili specifiche di ruolo  
- `defaults/` → variabili di default (può essere sovrascritte)  

---

## 7.2 Creazione di un Ruolo

Esempio:

```bash
ansible-galaxy init nginx
```

Questo comando genera automaticamente la struttura del ruolo.

---

## 7.3 Utilizzo dei Ruoli in un Playbook

Esempio `playbooks/web.yml`:

```yaml
- name: Configurazione Web Server
  hosts: web
  become: true
  roles:
    - nginx
```

Il ruolo viene eseguito con tutte le sue tasks, handlers, template e variabili.

---

## 7.4 Variabili

Le variabili possono essere definite in diversi livelli di precedenza:

1. Variabili host specifiche (`host_vars/host1.yml`)  
2. Variabili di gruppo (`group_vars/web.yml`)  
3. Variabili definite nel ruolo (`vars/main.yml`)  
4. Variabili di default del ruolo (`defaults/main.yml`)  
5. Variabili inline nel playbook  

Esempio `group_vars/web.yml`:

```yaml
http_port: 80
max_clients: 200
```

---

## 7.5 Gestione Segreti con Ansible Vault

**Ansible Vault** permette di cifrare variabili sensibili come password o chiavi.

Creazione file criptato:

```bash
ansible-vault create group_vars/web/secrets.yml
```

Esempio contenuto:

```yaml
db_password: "SuperSegreta123"
```

Esecuzione playbook con Vault:

```bash
ansible-playbook playbooks/web.yml --ask-vault-pass
```

Modifica file criptato:

```bash
ansible-vault edit group_vars/web/secrets.yml
```

---

## 7.6 Best Practice Ruoli e Variabili

- Separare configurazioni per ruolo
- Non hardcodare password nei playbook
- Usare nomi di variabili chiari e coerenti
- Riutilizzare ruoli comuni per diversi progetti
- Versionare tutto il progetto con Git (escludendo segreti se necessario)

---

## 7.7 Conclusione

I ruoli, le variabili e la gestione dei segreti sono elementi fondamentali per strutturare progetti Ansible professionali.

Permettono:

- Modularità
- Scalabilità
- Sicurezza
- Manutenzione più semplice

Nei prossimi capitoli si può approfondire:

- Template Jinja2  
- Deploy applicativi completi  
- Hardening e sicurezza avanzata  
- Logging e troubleshooting