Home/Ansible
Laboratorio · Manuale di Ansible

Ansible

Il direttore d'orchestra dell'infrastruttura.

28 esercizi8 Parti6 appendici
Il codice colore indica il livello:FondamentaleIntermedioAvanzatoCloud Architect
scarica gli esercizi
git clone --filter=blob:none --sparse https://github.com/calmict/book_labs.git
cd book_labs
git sparse-checkout set ansible/ed1
calm@calmict:~$ cat ansible/argomenti
Parte 1

Le Fondamenta del Controllo

  • 01Le tre crepeFondamentale
  • 02Il messaggero, non l'inquilinoFondamentale
  • 03La chiave che resta a casaFondamentale
  • 04Lo spartito che menteFondamentale
  • 05L'interruttore e il campanelloFondamentale
Parte 2

Primi Passi nel Caos

  • 06La bacchettaFondamentale
  • 07Il leggio più vicinoFondamentale
  • 08La rubricaFondamentale
  • 09Il cenno, non lo spartitoFondamentale
Parte 3

L'Arte dell'Automazione

  • 10Lo spartito scrittoFondamentale
  • 11Le chiavi del custodeIntermedio
  • 12Le annotazioni sullo spartitoIntermedio
  • 13La catena di comandoIntermedio
  • 14Il richiamo a fine provaIntermedio
  • 15Se, e per ciascunoIntermedio
Parte 4

Modularità Strutturata

  • 16La sezioneIntermedio
  • 17Il repertorio condivisoIntermedio
Parte 5

Gestione dei Dati Sensibili

  • 18La cassaforteAvanzato
  • 19Il caveauAvanzato
Parte 6

Strumenti Avanzati

  • 20L'arrangiatoreAvanzato
  • 21L'appelloAvanzato
  • 22Quando salta una cordaAvanzato
Parte 7

Qualità e Testing

  • 23La prova generaleAvanzato
  • 24Il palcoscenico usa-e-gettaAvanzato
  • 25Il tempo giustoCloud Architect
Parte 8

Automazione in Produzione

  • 26La macchina di scenaCloud Architect
  • 27Senza fermare la musicaCloud Architect
  • 28Il teatro stabileCloud Architect
calm@calmict:~$ ls ansible/esercizi/
01Le tre crepeFondamentale

Cosa costruisci

Il manuale si apre con una promessa: diventare il direttore d'orchestra della tua infrastruttura. Ma prima di alzare la bacchetta bisogna capire *perché* lo spartito scritto a mano — lo script Bash — si sbriciola quando i musicisti non sono tre ma tremila. In questo primo laboratorio non useremo ancora Ansible: lo installeremo al capitolo 6. Qui proverai con le tue mani il *problema* che Ansible esiste per risolvere, così che tutto il resto del manuale abbia un senso.

Tre "server" (tre container), uno stato che vuoi mantenere identico su tutti, e uno script che prova a imporlo. Lo script funzionerà. Poi lo rieseguirai, e si aprirà la prima crepa.

Obiettivi

  • Vedere all'opera le tre crepe dello scripting imperativo: non è ripetibile, descrive *passi* e non uno *stato*, la divergenza è inevitabile.
  • Distinguere due idee che sembrano la stessa cosa e non lo sono: ripetibilità (posso rilanciarlo senza che esploda) e convergenza (mi riporta allo stato voluto, qualunque fosse la partenza).
  • Capire perché il salto da 3 a 3000 server non è quantitativo ma qualitativo, e cosa significano push e pull.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap01/solution
./run.sh

Esito atteso

  • Lo script di partenza fallisce al secondo giro con l'errore di useradd (crepa 1 vista).
  • Con le guardie del TODO 1 lo script si rilancia senza errori, ma dopo il sabotaggio il drift su server2 sopravvive con la guardia cieca (crepa 3 vista).
  • Con il TODO 2 (guardia sul contenuto) server2 torna a version=1.0 dopo il sabotaggio (convergenza).
  • Sai spiegare a parole tue perché *ripetibile* non è *convergente*, e perché a 3000 server lo script imperativo non basta.
02Il messaggero, non l'inquilinoFondamentale

Cosa costruisci

Il direttore d'orchestra non impianta un chip nel cervello di ogni musicista: parla, e loro — che già sanno leggere la musica — eseguono. Ansible funziona così. Non installa un *agente* che vive sulla macchina: la visita via SSH, le fa fare una cosa usando il Python che è già lì, e se ne va. Questo si chiama

In questo laboratorio diventi tu il messaggero: rifarai a mano, via SSH, il viaggio che Ansible automatizza per ogni task. Non useremo ancora Ansible (lo installi al capitolo 6): lo scopo è proprio dimostrare che sul target non serve *niente di suo* — solo SSH e Python.

Obiettivi

  • Capire agentless e i suoi tre regali: niente da installare/mantenere sul target, nessun demone in ascolto (superficie d'attacco invariata), funziona su qualunque cosa parli SSH + Python.
  • Distinguere control node (la tua macchina, da cui parti) e managed node (la macchina che configuri, che non ospita nulla di tuo).
  • Ricostruire il viaggio di un task, fotogramma per fotogramma: copia il modulo, eseguilo col Python remoto, JSON su stdout, pulizia.
  • Vedere il ruolo di Python — e quando *non* serve (il modulo raw, pura shell via SSH).
  • Toccare i facts: come Ansible "intervista" la macchina.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap02/solution
./run.sh

Esito atteso

  • Il managed node è in piedi con solo sshd + python3, e ci entri in SSH a chiave.
  • module.py completato restituisce un JSON valido con almeno tre facts in ansible_facts, eseguito con il Python del nodo.
  • Hai riprodotto i quattro fotogrammi del viaggio (copia, esecuzione remota, JSON, pulizia), e alla fine sul nodo non resta il file temporaneo.
  • Sai dire perché il modulo raw non richiede Python sul target, e a cosa serve.
03La chiave che resta a casaFondamentale

Cosa costruisci

Al capitolo 2 lo script ti ha regalato una chiave e sei entrato sul managed node *tutto* Ansible. Il cuore è la crittografia asimmetrica e una regola d'oro: la chiave privata non lascia mai il control node; viaggia solo la sua metà

Obiettivi

  • Capire la coppia asimmetrica: privata (resta a casa) e pubblica (va sui server, in authorized_keys); e l'handshake che lo mette in pratica.
  • Anatomia dei file e i permessi che contano (la trappola "UNPROTECTED PRIVATE KEY").
  • ~/.ssh/config: alias leggibili e ControlMaster, il multiplexing che rende Ansible veloce.
  • Bastion host / ProxyJump: attraversare una rete segregata.
  • Passphrase (protezione a riposo), ssh-agent (automazione senza prompt), e la trappola dell'host key checking.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap03/solution
./run.sh

Esito atteso

  • Entri nel bastion con la chiave via alias; la chiave a 0644 viene rifiutata.
  • L'entry target con ProxyJump ti porta sul target attraverso il bastion (il diretto fallisce).
  • Con il ControlMaster la seconda connessione è quasi istantanea (socket master creato).
  • Sai spiegare perché la chiave privata non deve mai lasciare il control node.
04Lo spartito che menteFondamentale

Cosa costruisci

YAML è lo spartito su cui scriverai ogni playbook e ogni inventario. Sembra banale — ed è proprio questa la trappola: un valore scritto come lo pensi può essere diventa 1350. In questo laboratorio impari l'anatomia di YAML e, soprattutto, a non farti mentire dallo spartito. Nessun container, niente Ansible ancora: solo file YAML e lo stesso parser che Ansible usa sotto il cofano (PyYAML).

Obiettivi

  • Le tre strutture — scalare, lista, dizionario — e l'annidamento per indentazione.
  • Le trappole silenziose (Norway Problem, tipi impliciti, zeri iniziali, base 60) e quelle rumorose (due punti, indentazione).
  • Quoting: quando e perché mettere le virgolette.
  • Block scalar: il pipe | (literal) e il maggiore > (folded).
  • Ancore e merge << per il riuso (DRY).
  • yamllint come rete di sicurezza.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap04/solution
./run.sh

Esito atteso

  • inspect.py su start/config.yml mostra i valori mis-tipati (country bool, version float, file_mode int…).
  • Dopo il TODO 1, gli stessi valori sono stringhe.
  • Dopo il TODO 2, web e db condividono &defaults via << e db sovrascrive solo il timeout.
  • Sai spiegare la differenza fra una trappola rumorosa e una silenziosa, e perché la seconda è peggio.
05L'interruttore e il campanelloFondamentale

Cosa costruisci

Al capitolo 1 hai visto la differenza tra "rilanciabile" e "convergente". Ora la portiamo al cuore: l'idempotenza. Un interruttore della luce è idempotente — lo porti su ON; se è già ON, non succede nulla, e la stanza è comunque illuminata. Un campanello no: ogni pressione suona di nuovo. Ansible è fatto di interruttori: gli dici lo *stato* voluto, lui agisce solo se serve, e ti dice di che colore è stato il cambiamento. Prima di installarlo (capitolo 6), lo costruisci in piccolo con le tue mani: un mini-motore idempotente in bash che riporta i colori e sa fare la "prova a vuoto".

Obiettivi

  • L'idempotenza senza paura: applicare due volte = applicare una volta.
  • Interruttore vs campanello; dichiarativo vs imperativo.
  • I colori del cambiamento: ok (verde, niente da fare), changed (giallo, ho agito), failed (rosso).
  • I cigni neri: operazioni non idempotenti per natura, e come giudicarle (changed_when).
  • La prova generale: check mode (dry-run) e diff.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap05/solution
./run.sh

Esito atteso

  • ensure.sh completato: 1° giro tutto [changed], 2° giro [ok] (idempotenza).
  • Il campanello append_line resta [changed] a ogni giro (non converge).
  • In check mode ensure_line dice [changed] WOULD ma non scrive.
  • render con changed_when riporta [ok] al 2° giro con gli stessi input.
06La bacchettaFondamentale

Cosa costruisci

Per cinque capitoli hai studiato la partitura senza mai alzare la bacchetta. Adesso la prendi in mano: installi Ansible. Ma da bravo direttore non sporchi il palco — lo installi in un ambiente isolato (un virtualenv), così non tocchi il Python di sistema. Poi accordi i musicisti: prepari i nodi che dai prossimi capitoli configurerai.

Obiettivi

  • ansible-core contro il pacchetto ansible: il motore + i moduli ansible.builtin, contro il bundle con centinaia di collection della community.
  • I metodi di installazione (sistema / pip / pipx) e perché il venv è la tua salvezza (isolamento).
  • Installare ansible-core in un venv e renderlo riproducibile con un requirements.txt.
  • Verificare: ansible --version, la famiglia di comandi, lo smoke test ansible localhost -m ping.
  • Preparare i nodi target: il laboratorio che userai da qui in poi.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap06/solution
./run.sh

Esito atteso

  • Il venv esiste e ansible --version mostra ansible-core.
  • I cinque comandi CLI rispondono.
  • ansible localhost -m ping → pong.
  • I due nodi target sono raggiungibili in SSH.
07Il leggio più vicinoFondamentale

Cosa costruisci

Il direttore ha la bacchetta (capitolo 6); ora serve il regolamento d'orchestra: ansible.cfg, il file dove vivono le regole di come Ansible lavora — quanti musicisti in parallelo, con che chiave entrare, se chiedere il permesso. La cosa più importante da capire non è *cosa* c'è scritto, ma quale copia del regolamento viene letta: Ansible guarda quattro leggii in ordine fisso e usa il primo che trova, per intero — niente fusioni. E c'è una trappola di sicurezza: se il leggio è in una stanza dove chiunque può scriverci, Ansible si rifiuta di leggerlo.

Obiettivi

  • La gerarchia di ricerca: ANSIBLE_CONFIG → ./ansible.cfg → ~/.ansible.cfg → /etc/ansible/ansible.cfg; il primo trovato vince tutto (non si fondono).
  • La struttura del file e la sezione [defaults] (inventory, forks, host_key_checking).
  • [privilege_escalation] (become) e [ssh_connection] (pipelining — il ControlMaster del capitolo 3 diventa impostazione).
  • Gli attrezzi di ansible-config: list, view, e il prezioso dump --only-changed.
  • La trappola della cartella world-writable: il cfg nella cwd è comodo e pericoloso.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap07/solution
./run.sh

Esito atteso

  • Sai dire quale cfg è attivo e perché (i quattro leggii in ordine).
  • start/ansible.cfg completato: dump --only-changed mostra forks, host_key_checking, become, pipelining col percorso del tuo file.
  • Hai visto la trappola: nella cartella world-writable il cfg viene ignorato col WARNING.
  • Sai spiegare perché la gerarchia non fonde i file, e cosa comporta.
08La rubricaFondamentale

Cosa costruisci

Il direttore ha bacchetta (cap. 6) e regolamento (cap. 7), ma non sa ancora chi sono i musicisti. L'inventario è la rubrica: i nomi degli host, i loro indirizzi, i gruppi in cui suonano. È il file che trasforma "un container sulla porta 2281" in web1, e "web1 e web2" in web — così da qui in poi dirai *ansible web* e non un elenco di IP. In questo laboratorio la scrivi in INI, la verifichi con gli attrezzi giusti, e alla fine il direttore chiama l'appello:

Obiettivi

  • Cos'è un inventario; il formato INI (host, gruppi, variabili) e l'equivalente YAML.
  • Gruppi di gruppi con :children.
  • I pattern di host: gruppi, esclusioni (web:!web2), combinazioni.
  • I range: edge[01:03] — tre host in una riga.
  • Variabili di host e di gruppo nell'inventario, e la forma ordinata: le cartelle group_vars/ e host_vars/.
  • I gruppi magici all e ungrouped; la verifica con ansible-inventory.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap08/solution
./run.sh

Esito atteso

  • ansible-inventory --graph mostra prod → web(web1,web2) + db(db1) e edge coi 3 host del range.
  • I pattern rispondono: web → 2 host, 'web:!web2' → 1, ungrouped → 0.
  • group_vars/web.yml esiste e debug stampa greeting su web1.
  • ansible prod -m ping → 3 SUCCESS.
09Il cenno, non lo spartitoFondamentale

Cosa costruisci

La rubrica risponde all'appello (cap. 8). Ora il direttore dà i primi ordini — ma senza scrivere lo spartito completo (quello è il playbook, cap. 10). Un comando per una cosa al volo (chi è acceso? quanto spazio disco? riavvia quel servizio); sbagliato per qualcosa da ripetere o versionare — lì serve lo spartito. Qui impari l'anatomia del cenno, l'arsenale dei moduli, e la differenza cruciale — che già intuivi dal cap. 5 — fra un modulo interruttore e un comando campanello.

Obiettivi

  • Quando l'ad-hoc e quando no.
  • L'anatomia: ansible <pattern> -m <modulo> -a "<args>" [-b].
  • command vs shell (pipe e redirezioni), e perché entrambi sono "campanelli".
  • L'arsenale: copy e file (interruttori idempotenti), setup (i facts = l'intervista del cap. 2).
  • I fork: parallelismo misurabile (cap. 7).
  • -b / become: amministratore al volo (cap. 7 e 11).
  • I casi reali (9.8): il giro del mattino.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap09/solution
./run.sh

Esito atteso

  • runbook.sh completato gira: motd deployato (copy), /etc/cap09.d creato (file+become), un fact letto (setup).
  • copy e file: secondo giro verde (idempotenti). command: sempre CHANGED.
  • command vs shell: la pipe è letterale con command, eseguita con shell.
  • -b: whoami passa da deploy a root.
10Lo spartito scrittoFondamentale

Cosa costruisci

Al capitolo 9 il direttore dava cenni al volo: un modulo, un bersaglio, subito. Utili, ma effimeri — nessuna traccia, niente da rivedere, niente da rieseguire con fiducia. Ora scrivi la partitura: il playbook, un file YAML che mette gli stessi moduli in ordine, con un nome, sotto controllo di versione. Questo è il cuore di Ansible — da qui in poi quasi tutto è un playbook. Impari la struttura a strati (play → task → modulo), scrivi il tuo primo playbook riga per riga, impari a leggerne l'output, e riscopri la proprietà più importante di tutte: rieseguirlo non fa danni (la prova del nove del cap. 5, ora su scala).

Obiettivi

  • Perché il playbook, e non il cenno: ripetibile, versionato, rivedibile.
  • La struttura a strati: play (chi + lista di task) → task (nome + modulo + argomenti) → modulo.
  • Il primo playbook riga per riga: ---, name, hosts, become, vars, tasks.
  • Eseguire e leggere l'output: PLAY, TASK, Gathering Facts, PLAY RECAP e i suoi contatori.
  • La prova del nove: rieseguire → changed=0 (idempotenza).
  • Più play nello stesso file.
  • Direttive utili subito: vars, become_user, tag (--tags / --skip-tags).
  • Buone abitudini fin dalla prima riga.

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap10/solution
./run.sh

Esito atteso

  • ansible-playbook site.yml mostra due play e un recap con web1/web2 (ok=4 changed=3) e db1 (ok=2 changed=1).
  • Rieseguendo → changed=0 su tutti e tre (idempotenza).
  • --tags structure esegue solo i task delle cartelle; --skip-tags content salta i copy.
  • --syntax-check passa.
11Le chiavi del custodeIntermedio

Cosa costruisci

Al capitolo 10 il privilegio era un interruttore acceso in blocco: become: true, e tutto girava da root. Ora apri quella scatola. become non è "diventa root e basta": è chiedere le chiavi al custode dell'edificio — su Linux, quasi sempre sudo. Il custode ha un regolamento (il file sudoers): decide *chi* può prendere *quale* chiave, e se prima deve mostrare un documento (la password). Questo capitolo — il primo della fascia Intermedio — ti fa vedere l'anatomia di become, il regolamento sotto il cofano, le tre risposte alla password, come diventare un utente *diverso* da root, e le regole d'oro per non lasciare in giro la chiave universale.

Obiettivi

  • Perché non collegarsi direttamente come root (11.1).
  • L'anatomia di become: become, become_method, become_user, become_flags (11.2).
  • sudoers sotto il cofano: il cancello che decide chi diventa chi (11.3).
  • La password di sudo: -K, la variabile (da cifrare), NOPASSWD (11.4).
  • Non solo sudo: gli altri metodi (11.5).
  • Diventare un utente diverso da root (11.6).
  • Le regole d'oro della sicurezza (11.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap11/solution
./run.sh

Esito atteso

  • Con become: true, il debug mostra deploy -> root e secops -> root.
  • web2 senza ansible_become_password → "Missing sudo password"; con la variabile → passa.
  • /srv/app/owner.txt è di appsvc, non di root; la cartella /srv/app è di appsvc.
  • Rieseguendo → changed=0 (idempotenza).
12Le annotazioni sullo spartitoIntermedio

Cosa costruisci

Lo spartito del capitolo 10 era rigido: /etc/motd, porta 80, quei valori scritti dentro il playbook. Ma web1 e web2 non sono identici — porte diverse, limiti diversi — e riscrivere il playbook per ciascuno sarebbe la crepa del capitolo 1 che ritorna. Le scritto una volta e riusato ovunque, che può arrivare da tante fonti — il gruppo, il singolo host, la riga di comando, i fatti che Ansible scopre da solo. In questo capitolo vedi che forma hanno (i tipi), come si usano (le doppie graffe di Jinja2), dove vivono, come catturare al volo un risultato, e come tenerle in ordine.

Obiettivi

  • Perché le variabili: un playbook, molti nodi (12.1).
  • I tipi di valore: stringa, intero, booleano, lista, dizionario (12.2).
  • Le doppie graffe di Jinja2: usarle, accedere a liste e dizionari (12.3).
  • Dove vivono: play, inventario (group_vars/host_vars), riga di comando -e (12.4).
  • I fatti: le variabili che Ansible scopre da solo (12.5).
  • Catturare i risultati: register e set_fact (12.6).
  • Le reti di sicurezza: i valori di default (12.7).
  • Mettere ordine: dove conviene definire cosa (12.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap12/solution
./run.sh

Esito atteso

  • config.ini renderizzato contiene tutti i tipi: stringa (app_name), intero (port), booleano (debug), lista (features), dizionario (max_connections/timeout).
  • web1 port=8080 (group_vars), web2 port=8081 (host_vars vince).
  • -e app_name=canary → canary su entrambi (extra var vince).
  • workers viene da set_fact (nproc × 2); log_level viene dal default (info).
  • Rieseguendo → changed=0 (idempotenza).
13La catena di comandoIntermedio

Cosa costruisci

Al capitolo 12 hai visto la riga di comando battere il group_vars, quasi senza pensarci. Non era magia: era precedenza. Ansible ti lascia definire una variabile in *tanti* posti — comodità enorme — ma il prezzo è che, quando due posti dichiarano lo stesso nome con valori diversi, qualcuno deve vincere. Ansible ha una catena di comando rigida: non ti fa costruire infrastruttura: ti fa *indagare*. Provochi scontri reali fra variabili, guardi chi vince, impari i tre principi che spiegano quasi tutto, i due trabocchetti che sorprendono tutti, e come progettare per non litigare mai.

Obiettivi

  • Perché esistono così tanti livelli (13.1).
  • I tre principi che spiegano quasi tutto (13.2).
  • La lista completa, dal più debole al più forte (13.3).
  • Scontri reali: vederla in azione (13.4).
  • Gli strumenti per non perdersi (13.5).
  • I due trabocchetti: i dizionari che non si fondono, i fatti (13.6).
  • Progettare per non combattere (13.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap13/solution
./run.sh

Esito atteso

  • winner: web1 = group_vars(web), web2 = host_vars(web2); con -e → EXTRA su entrambi.
  • bad_limits: web1 ha 2 chiavi, web2 ne ha 1 (il dizionario è stato sostituito, non fuso).
  • combine: il merge dà a web2 {max_connections: 500, timeout_seconds: 30} (timeout salvo).
  • set_fact: mode resta set_fact_value anche con un task var (19 batte 17).
14Il richiamo a fine provaIntermedio

Cosa costruisci

Cambi la configurazione di un servizio: ora va ricaricato perché la rilegga. Ma ricaricarlo a *ogni* esecuzione del playbook — anche quando non hai toccato nulla — è spreco e rischio: interruzioni inutili, connessioni cadute, per niente. Vuoi ricaricarlo handler: un task lascia un *richiamo*, e a fine prova — solo se quel task ha riportato changed — l'handler scatta. È il colore changed del capitolo 5 che smette di essere un semplice segnale e diventa un innesco**.

Obiettivi

  • Il problema: ricaricare solo quando serve (14.1).
  • Il motore: lo stato changed (14.2).
  • notify e handler: la coppia che risolve (14.3).
  • Le tre regole d'oro degli handler (14.4).
  • Più handler insieme, e il trucco di listen (14.5).
  • Controllare a mano il changed con changed_when (14.6).
  • Un esempio reale, dall'inizio alla fine (14.7).
  • Buone abitudini con gli handler (14.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap14/solution
./run.sh

Esito atteso

  • Prima esecuzione: reloads.log e metrics.log hanno 1 riga ciascuno (due task notificano, due handler via listen, ognuno gira una volta).
  • Rieseguendo senza modifiche: i log restano a 1 (regola 2).
  • Con -e greeting=ciao: la config cambia → i log salgono a 2.
  • Con -e force_reload=true: pur senza modifiche ai file, changed_when innesca → i log salgono ancora.
15Se, e per ciascunoIntermedio

Cosa costruisci

Finora ogni task faceva una cosa, una volta, sempre. Ma la realtà si adatta: dev e prod non sono uguali, certe feature sono opzionali, certe azioni vanno ripetute su venti elementi. Servono due nuovi poteri. when dà al task la capacità di *decidere*: agisci solo *se* una condizione è vera. loop gli dà quella di *ripetere*: un solo task, molti elementi. Con questi due — e con la trappola delle graffe che li accompagna — un playbook smette di essere una lista fissa e diventa una procedura intelligente.

Obiettivi

  • Il problema: un playbook che si adatta (15.1).
  • when: il task che decide se agire (15.2), e la trappola delle graffe (15.3).
  • register + when: condizioni sull'esito di un task (15.4).
  • Condizioni composte: and, or, la lista AND (15.5); e is defined (15.6).
  • loop: un task, molti elementi (15.7), anche liste di dizionari (15.8).
  • loop + register e loop_control (15.9, 15.10); i vecchi with_* (15.11).
  • Le graffe, una volta per tutte (15.13).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap15/solution
./run.sh

Esito atteso

  • loop: gli utenti websvc (/bin/bash) e batchsvc (/usr/sbin/nologin) sono creati; le cartelle logs, cache, run esistono.
  • dev (default): PRODUCTION, metrics.enabled e tuning.conf non esistono (tre skip); firstrun.txt sì.
  • Riesecuzione: il task di primo avvio salta (sentinella).
  • -e app_env=prod -e enable_metrics=true -e tuning_profile=fast: i tre file compaiono.
  • -e app_env=prod da solo: metrics.enabled non compare (l'AND vuole entrambe).
16La sezioneIntermedio

Cosa costruisci

Il playbook del capitolo 15 sa decidere e ripetere — ma è cresciuto: task, variabili, template, handler, tutto ammucchiato in un file solo. Domani un secondo progetto vorrà la stessa app: copi e incolli? Il ruolo è la risposta. È una sezione dell'orchestra: un blocco autonomo, con dentro i suoi task, i suoi file, la sua accordatura predefinita, che il direttore richiama con un nome — e che puoi riusare in qualsiasi concerto. In questo capitolo trasformi quel playbook gonfio in un ruolo pulito, e il playbook torna a essere tre righe.

Obiettivi

  • Il problema: il playbook che non smette di crescere (16.1).
  • Cos'è un ruolo: una cartella con struttura precisa (16.2, 16.3).
  • Il playbook che diventa minuscolo (16.4).
  • defaults contro vars: il cuore della riusabilità (16.5).
  • files e templates: niente più percorsi (16.6).
  • meta e dipendenze (16.7); include_role e import_role (16.8).
  • Lo scheletro con ansible-galaxy init (16.9); anatomia di un buon ruolo (16.10).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap16/solution
./run.sh

Esito atteso

  • ansible-galaxy init crea lo scheletro; i main.yml sono riempiti.
  • Config renderizzata: app_name = webfromgroup (group_vars batte defaults), config_dir = /etc/webapp (vars del ruolo batte group_vars; /etc/WRONG non esiste).
  • template (app.conf.j2) e file (motd) risolti senza percorsi, dalle cartelle del ruolo.
  • L'handler reload webapp scatta (da handlers/main.yml del ruolo).
  • Il playbook è di tre righe (roles: - webapp); rieseguendo → changed=0.
17Il repertorio condivisoIntermedio

Cosa costruisci

Il ruolo del capitolo 16 è tuo, scritto in casa. Ma migliaia di persone hanno già scritto e condiviso ruoli e moduli per ogni compito immaginabile: gestire firewall, database, provider cloud, servizi di sistema. Non devi ricomporre ciò che esiste già — puoi attingere al l'FQCN. Questo capitolo — l'ultimo della fascia Intermedio — ti insegna a stare sulle spalle dei giganti senza perdere la riproducibilità.

Obiettivi

  • Sulle spalle dei giganti, e dai ruoli alle collezioni (17.1, 17.2).
  • Il mistero dei nomi puntati: l'FQCN (17.3).
  • Installare una collezione (17.4) e dichiararla in requirements.yml (17.5).
  • Dove finiscono le collezioni e come tenerle col progetto (17.6).
  • Usarla in un playbook (17.7).
  • Automation Hub e i repository privati (17.8); pubblicare (17.9).
  • Le buone abitudini con Galaxy e le collezioni (17.10).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap17/solution
./run.sh

Esito atteso

  • requirements.yml installa community.general (versione pinnata) in ./collections (dentro il progetto).
  • Il playbook usa community.general.ini_file via FQCN e scrive [server] port = 8080 nell'INI.
  • Rieseguendo → changed=0 (il modulo della collezione è idempotente come i builtin).
  • ansible-galaxy collection list mostra la versione pinnata, dal path del progetto.
18La cassaforteAvanzato

Cosa costruisci

Al capitolo 11 hai chiesto le chiavi al custode: become, e per il nodo con sudo a password l'hai fatto funzionare — ma la password l'hai scritta *in chiaro* nell'inventario, con la promessa "un giorno la cifreremo". Quel giorno è oggi. Un playbook finisce in un repository Git, e Git *non dimentica*: una password committata in chiaro resta nella cronologia per sempre, anche se la cancelli domani. Questo capitolo — il primo della fascia Avanzato — apre la cassaforte di Ansible: Ansible Vault, che cifra i segreti *dentro* i tuoi file, così che il repository resti condivisibile e il segreto resti segreto.

Obiettivi

  • Il peccato originale: il segreto in chiaro, e perché Git lo rende eterno (18.1).
  • La cifratura con una parola d'ordine (18.2) e i comandi di ansible-vault (18.3).
  • Com'è fatto un file cifrato (18.4).
  • Cifrare il singolo segreto con encrypt_string (18.5).
  • Eseguire un playbook con dati cifrati: password interattiva, file, config (18.6).
  • Più segreti, più password: i vault-id (18.7).
  • I limiti di Vault e cosa viene dopo (18.8); le buone abitudini (18.9).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap18/solution
./run.sh

Esito atteso

  • In group_vars/web/vars.yml non c'è nessuna password in chiaro: solo l'indirezione {{ vault_become_password }} e il blocco !vault inline.
  • group_vars/web/vault.yml è cifrato (prima riga $ANSIBLE_VAULT;1.1;AES256); ansible-vault view mostra il valore.
  • Il playbook diventa root con la password presa dal vault e scrive il marker root:root; rieseguendo → changed=0.
  • Senza parola d'ordine il playbook fallisce con "Attempting to decrypt but no vault secrets found".
  • Il segreto etichettato prod ha l'intestazione ;1.2;AES256;prod e si decifra con la sua vault-id.
19Il caveauAvanzato

Cosa costruisci

Al capitolo 18 hai chiuso la password in cassaforte. Ma alla fine restava un paradosso: la cassaforte è cifrata, e la sua chiave — la parola d'ordine del vault — dove vive? Se la scrivi in un file accanto al playbook, sei tornato al peccato del capitolo 11: un segreto in chiaro su disco. Il capitolo 18 ha spostato il problema, non l'ha eliminato. La soluzione vera cambia paradigma: il segreto non si conserva affatto — né in chiaro né cifrato — ma si va a prendere a runtime da un servizio esterno che lo custodisce, lo consegna a chi ha diritto, e non lascia mai che riposi con te. Quel servizio è un caveau: in questo laboratorio, HashiCorp Vault.

Obiettivi

  • I tre limiti che Vault (cap. 18) non risolve (19.1).
  • Il cambio di paradigma: il lookup a runtime (19.2).
  • HashiCorp Vault e la collezione community.hashi_vault (19.3).
  • Autenticazione: token, AppRole e l'identità di macchina (19.4).
  • I secret manager del cloud: AWS, Azure, GCP (19.5).
  • Le chiavi SSH in produzione: distribuzione, rotazione, bastion (19.6).
  • no_log: il segreto che non deve finire nei log (19.7).
  • Quando basta Vault (cap. 18), quando serve un manager (19.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap19/solution
./run.sh

Esito atteso

  • requirements.yml installa community.hashi_vault; hvac è nel venv.
  • In group_vars/web/vars.yml la become password è un lookup community.hashi_vault, non un valore.
  • Il playbook diventa root con la password presa dal caveau; il marker è root:root; rieseguendo → changed=0.
  • Il segreto secops-pw non compare nella configurazione (group_vars, site.yml) né nell'output a -vvv.
  • L'AppRole (identità di macchina) legge lo stesso segreto con una policy di sola lettura.
  • Il task marcato no_log mostra "the output has been hidden" a -vvv.
20L'arrangiatoreAvanzato

Cosa costruisci

Finora hai *passato* i dati: una variabile qui, una lista lì, un dizionario in un template. Ma i dati grezzi raramente hanno già la forma che ti serve: hai un elenco di servizi e ne vuoi solo quelli attivi; hai una configurazione di base e un pacchetto di modifiche per l'ambiente, e li vuoi fusi; hai una mappa e la vuoi scorrere riga per riga. Il capitolo 20 ti dà l'arrangiatore: Jinja2 nella sua forma piena — i filtri che trasformano, i test che interrogano, i lookup che pescano — e i template .j2 che, dai dati, scrivono la configurazione *da soli*. Smetti di scrivere config a mano: la config diventa una *funzione* dei dati.

Obiettivi

  • Le tre famiglie: filtri, test, lookup (20.1).
  • default e mandatory: la rete di sicurezza (20.2).
  • Trasformare i dati: map, select, selectattr (20.3).
  • Lavorare coi dizionari: dict2items e combine (20.4).
  • I test: is defined, is version e gli altri (20.5).
  • I template .j2: configurazioni che si scrivono da sole (20.6).
  • I lookup, finalmente per intero (20.7).
  • Le buone abitudini con Jinja2 (20.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap20/solution
./run.sh

Esito atteso

  • enabled_services (TODO 1) tiene solo i servizi con enabled vero.
  • effective_config (TODO 2) fonde base e override (timeout 60, loglevel debug).
  • app.conf reso contiene la sezione [settings] cogli override, un blocco per api-01/db-01/web-01 (in ordine, non web-02 che è disattivo), e "allowed prod ports: 8080,8081,5432".
  • Rieseguendo → changed=0 (il template è idempotente).
  • Il playbook gira in connection: local, senza nodi.
21L'appelloAvanzato

Cosa costruisci

Al capitolo 8 hai scritto la rubrica a mano: un file con i nodi, uno per riga. Funziona finché la flotta sta ferma. Ma nel mondo reale la flotta *si muove da sola*: macchine che nascono quando il carico sale e muoiono quando scende, nel cloud, mentre tu dormi. Una rubrica scritta a mano è vecchia nel momento in cui la salvi. La risposta è ribaltare il meccanismo: invece di *elencare* i nodi, li fai presentare all'appello — Ansible chiede a chi la flotta la conosce davvero (il provider) "chi c'è adesso?", e costruisce l'inventario *sul momento*. Qui il provider è il demone Docker, e la flotta sono container che vanno e vengono; ma AWS, Azure, GCP funzionano identici.

Obiettivi

  • Statico contro dinamico: il cambio di mentalità (21.1).
  • Il meccanismo: i plugin di inventario (21.2).
  • Il primo inventario dinamico su AWS (21.3, galleria).
  • La vera magia: raggruppare con keyed_groups (21.4).
  • groups e compose: i filtri Jinja2 al lavoro (21.5).
  • Nomi leggibili e prestazioni: hostnames e cache (21.6).
  • Le buone abitudini con gli inventari dinamici (21.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap21/solution
./run.sh

Esito atteso

  • L'inventario dinamico scopre i tre container della flotta (cap21-web1/web2/db1) senza che tu ne scriva i nomi.
  • keyed_groups (TODO 1) crea role_web (web1, web2), role_db (db1), env_prod (web1, db1), env_staging (web2).
  • groups (TODO 2) crea production con web1 e db1 (i soli env=prod).
  • compose rende ogni nodo raggiungibile via connessione docker: ansible role_web -m ping → pong.
  • site.yml (TODO 3) su role_web tocca solo web1 e web2; rieseguendo → changed=0.
22Quando salta una cordaAvanzato

Cosa costruisci

Sai scoprire la flotta (cap. 21) e agirci sopra. Ma un'orchestra vera suona in un mondo imperfetto: una corda salta a metà concerto, un leggio cade, un musicista sbaglia l'attacco. La domanda non è *se* qualcosa andrà storto su uno dei mille nodi dell'appello, ma *cosa fa il direttore quando succede*. Di default Ansible, davanti a un errore, si ferma su quell'host — prudente, ma non basta. Questo capitolo ti dà gli strumenti della resilienza: recuperare con block/rescue/always, riprovare ciò che è lento, ridefinire cosa conta come errore, e — quando serve — fermare tutto in fretta prima che il disastro si propaghi.

Obiettivi

  • Il comportamento di default: fermarsi su quell'host (22.1).
  • block, rescue, always: il try/catch/finally di Ansible (22.2).
  • ignore_errors: continuare nonostante tutto, con giudizio (22.3).
  • failed_when e changed_when: ridefinire successo e cambiamento (22.4).
  • Riprovare ciò che è lento: until, retries, delay (22.5).
  • Fallire in fretta: any_errors_fatal e max_fail_percentage (22.6).
  • Validare prima di agire: assert e fail (22.7).
  • Gli handler e i fallimenti: force_handlers (22.8).
  • Le buone abitudini con la gestione degli errori (22.9).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap22/solution
./run.sh

Esito atteso

  • assert (TODO 3) blocca deploy_env=banana *prima* di scrivere qualsiasi file; con un valore valido prosegue.
  • block/rescue/always (TODO 1): su db1 esistono i marker rollback e cleanup; su web1 esistono deployed e cleanup ma *non* rollback; il play non risulta fallito (rescued=1 su db1).
  • until (TODO 2): l'health check passa dopo alcuni tentativi invece di fallire subito.
  • ignore_errors lascia il play a failed=0 (ignored maggiore o uguale a 1); failed_when: false tratta rc=1 come successo.
  • handlers.yml: fh.done esiste nonostante il fallimento (force_handlers).
  • failfast.yml: con any_errors_fatal il rollout non raggiunge nessun host.
23La prova generaleAvanzato

Cosa costruisci

Il capitolo 22 ti ha insegnato a *reagire* agli errori. Ma il modo migliore di gestire un errore è non commetterlo — o almeno scoprirlo *prima* di toccare la produzione. Prima di un concerto nessuna orchestra sale sul palco alla cieca: rilegge le parti (c'è un errore di stampa?), fa la prova generale a teatro vuoto (suona tutto, senza pubblico), e solo allora apre le porte. Ansible ti dà la stessa rete di sicurezza, a tre livelli sempre più ricchi: --syntax-check (la lettura veloce), ansible-lint (il revisore esperto), e il check mode con --diff (la prova generale che ti mostra cosa cambierebbe senza cambiarlo). Meglio un errore rosso sul tuo terminale che un guasto silenzioso su mille nodi.

Obiettivi

  • Tre livelli di rete, dal più economico al più ricco (23.1).
  • Il primo gradino: --syntax-check (23.2).
  • ansible-lint: la saggezza della community in un comando — profili, falsi positivi (23.3).
  • Il check mode: la prova generale a teatro vuoto, con --diff (23.4).
  • I limiti del check mode, e come aggirarli (23.5).
  • Mettere tutto in fila: il flusso di validazione (23.6).
  • Le buone abitudini con la validazione (23.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap23/solution
./run.sh

Esito atteso

  • --syntax-check passa su site.yml.
  • ansible-lint passa su site.yml (TODO 1) al profilo production dichiarato in .ansible-lint (TODO 3); e *fallisce* sul playbook sciatto di partenza.
  • Il task di lettura ha check_mode: false (TODO 2): gira anche in --check.
  • --check --diff mostra la diff di conf.txt ma *non* scrive il file; l'esecuzione reale lo scrive; rieseguendo → changed=0.
24Il palcoscenico usa-e-gettaAvanzato

Cosa costruisci

Il capitolo 23 ti ha dato tre reti — syntax-check, lint, check mode — ma nessuna delle tre *esegue* davvero il ruolo su un sistema vero. Un lint pulito e una prova a teatro vuoto dicono che il playbook è *ben scritto* e cosa *cambierebbe*, non che il ruolo funziona: che parte da zero, converge, è idempotente, e lascia il sistema nello stato giusto. Questo è il muro che il capitolo 23 non supera. Molecule lo abbatte: monta un ambiente vero ma usa-e-getta (un container), applica il ruolo, verifica idempotenza e risultato, e smonta tutto — un comando su, un comando giù. È la prova sul palco vero, con la certezza di poterlo sempre ricostruire da capo.

Obiettivi

  • Il muro del capitolo 23 e perché serve un collaudo che esegua davvero (24.1).
  • Che cos'è Molecule: l'ambiente usa-e-getta come banco di prova (24.2).
  • Installazione e primo scenario (24.3).
  • Anatomia di uno scenario: driver, platforms, provisioner, verifier (24.4).
  • Il ciclo di vita: create, converge, idempotence, verify, destroy (24.5).
  • Scrivere le verifiche con Testinfra: un secondo paio d'occhi (24.6).
  • Lavorare a fasi durante lo sviluppo (24.7).
  • Più scenari, più distribuzioni (24.8).
  • Le buone abitudini con Molecule (24.9).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap24/solution
./run.sh

Esito atteso

  • molecule.yml dichiara la piattaforma e il verifier testinfra (TODO 1).
  • Il task del marcatore ha la guardia creates (TODO 2): la fase idempotence passa (changed=0).
  • Le verifiche testinfra sono scritte (TODO 3) e la fase verify passa.
  • "molecule test" è verde dall'inizio alla fine: create, converge, idempotence, verify, destroy — e non lascia container in giro.
25Il tempo giustoCloud Architect

Cosa costruisci

Finora hai orchestrato pochi nodi, e a pochi nodi ogni playbook sembra veloce. Ma la fascia Cloud Architect comincia da una domanda diversa: cosa succede quando i nodi diventano mille? A quella scala un secondo di troppo per host non è un secondo — è un'attesa che non finisce, moltiplicata per mille, ripetuta a ogni deploy. Il collo di bottiglia non è più *cosa* fa il playbook, ma *come* Ansible lo distribuisce sulla flotta. Questo capitolo ti dà le leve per stringere quel tempo: quanti nodi guidare insieme (forks), se farli marciare in lock-step o lasciarli correre (strategie), e come non pagare lavoro che non serve (domare i fatti). Le misuri su una flotta vera — dodici nodi — e le vedi mordere: la stessa consegna passa da ~24 secondi a ~8.

Obiettivi

  • Perché a larga scala il problema cambia natura: non il task, ma la distribuzione (25.1).
  • forks: quanti nodi Ansible guida in parallelo, e perché "a ondate" costa (25.2).
  • Strategie — linear contro free: la barriera per-task e come toglierla (25.3).
  • Pipelining e ControlPersist: meno round-trip SSH per task (25.4).
  • Domare i fatti: gather_facts off, gather_subset, fact caching (25.5).
  • Mitogen: il plugin di strategia che riscrive l'esecuzione — potente e impegnativo (25.6).
  • Misurare, non indovinare: il callback profile_tasks (25.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap25/solution
./run.sh

Esito atteso

  • ansible.cfg porta forks = 12 (TODO 1): la flotta gira in una sola ondata.
  • deploy.yml usa strategy: free (TODO 2): niente barriera per-task.
  • deploy.yml usa gather_facts: false (TODO 3): niente setup inutile.
  • La consegna accordata è nettamente più veloce di quella di partenza (qui ~8s contro ~24s) e profile_tasks lo conferma: la raccolta fatti sparisce, i passi non marciano più in lock-step.
26La macchina di scenaCloud Architect

Cosa costruisci

Il capitolo 25 ti ha dato la velocità per servire mille nodi. Ma a questa scala una cosa è già cambiata sotto i tuoi piedi: non è più una persona a lanciare il playbook. Con mille nodi e più mani sullo stesso codice, un ansible-playbook battuto a mano dal portatile di qualcuno è troppo fragile — nessuno ha controllato il lint, nessuno sa da quale versione parte, nessuno impedisce che una modifica non provata finisca in produzione un venerdì sera. La risposta è una macchina di scena: ogni modifica passa dal controllo di versione, attraversa una pipeline che la valida da sola (CI), e solo una release autorizzata attraversa il cancello ed entra in produzione (CD). Questo capitolo la costruisce: i cancelli di qualità su GitHub Actions, il cancello di produzione che si apre solo su un tag, e i pre-commit hook che anticipano il controllo prima ancora del commit.

Obiettivi

  • Che cosa significano CI e CD, e perché a scala sostituiscono la persona che lancia (26.1).
  • Il fondamento: senza controllo di versione non c'è pipeline (26.2).
  • L'anatomia di una pipeline Ansible: i cancelli in fila (26.3).
  • Una pipeline concreta: GitHub Actions e i cancelli di qualità (26.4).
  • Il deploy e il cancello di produzione: chi entra in scena, e quando (26.5).
  • GitLab CI: lo stesso pattern, altra sintassi (26.6).
  • Anticipare ancora: i pre-commit hook, lo stesso cancello prima del commit (26.7).
  • Le buone abitudini con CI/CD (26.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap26/solution
./run.sh

Esito atteso

  • Il job test di ci.yml esegue i due cancelli di qualità a ogni push (TODO 1): lint.sh e validate.sh.
  • Il job deploy ha needs: test e l'if sul tag (TODO 2): non parte se la CI fallisce, e gira solo su un tag di release.
  • .pre-commit-config.yaml ha l'hook ansible-lint locale (TODO 3): lo stesso lint scatta prima del commit.
  • I cancelli mordono davvero: verdi sul progetto buono, rossi su un playbook rotto — sia nella pipeline sia nel pre-commit.
27Senza fermare la musicaCloud Architect

Cosa costruisci

Il capitolo 26 ti ha dato la macchina di scena che porta una modifica fino alla porta della produzione. Ma il job di deploy era una riga di echo, e ora arriva la domanda vera: *come* si aggiorna una flotta di mille nodi senza spegnere il servizio? Applicare a tutti insieme è un disservizio — per qualche secondo o minuto, ogni backend è giù nello stesso momento. Un direttore d'orchestra non ferma tutta l'orchestra per far cambiare l'arco a un violinista: fa entrare e uscire le sezioni una alla volta, e la musica non si interrompe mai. Questo è l'orchestrazione: il rolling update. Questo capitolo ti dà le leve — serial (aggiorna a ondate), delegate_to (di' al bilanciatore di togliere il nodo dal giro prima di toccarlo), la coreografia pre_tasks/tasks/post_tasks (drena → aggiorna → ri-abilita), e max_fail_percentage (il freno d'emergenza che ferma tutto se un'ondata va male) — e le vedi all'opera su una web-farm dove, in ogni istante, non più di un'ondata è fuori dal giro.

Obiettivi

  • Dall'automazione all'orchestrazione: perché "applica a tutti" non basta più (27.1).
  • La prima leva: serial e i rilasci a ondate (27.2).
  • La seconda leva: delegate_to col bilanciatore (27.3).
  • La coreografia completa: pre_tasks, tasks, post_tasks (27.4).
  • Il freno d'emergenza: max_fail_percentage (27.5).
  • Quando qualcosa va storto: rollback e recupero (27.6).
  • Coordinare più livelli e più gruppi (27.7).
  • Le buone abitudini con l'orchestrazione (27.8).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap27/solution
./run.sh

Esito atteso

  • Il play ha serial: 2 (TODO 1): il rilascio procede a ondate, mai tutta la farm insieme.
  • Il play ha le post_tasks che ri-abilitano il nodo (TODO 2): ogni nodo drenato rientra nel giro.
  • Il play ha max_fail_percentage: 25 (TODO 3): un'ondata che fallisce ferma il rollout.
  • Il registro del pool lo conferma: ogni nodo esce e rientra, e in ogni istante non più di un'ondata (2) è fuori dal giro.
28Il teatro stabileCloud Architect

Cosa costruisci

Il capitolo 27 ti ha dato il rilascio a ondate; il 26 la pipeline che lo lancia. Ma in tutti e due sei ancora tu — o uno script — a battere un comando da un terminale, con inventari, credenziali e "chi-può-fare-cosa" tenuti in testa o sparsi in file. Funziona per una persona. Non funziona per un'organizzazione: dieci team, centinaia di playbook, migliaia di nodi, revisori e audit. A quel punto il terminale non basta più — come una compagnia che gira di piazza in piazza non basta più quando la città vuole una stagione stabile, con una sede, un botteghino, un organico e un archivio. l'automazione smette di essere un gesto al terminale e diventa un servizio con una console, i suoi permessi e la sua storia. Questo capitolo ne monta gli oggetti fondamentali — il job template, le versionati e validati prima di entrare in scena. Perché il modo Cloud Architect di gestire la piattaforma non è "clicca nella UI": è GitOps anche qui.

Obiettivi

  • Perché il terminale non basta più a scala di organizzazione (28.1).
  • AWX e Ansible Automation Platform: chi è chi (28.2).
  • Il concetto centrale: il job template (28.3).
  • Credenziali, RBAC e audit: il governo dell'accesso (28.4).
  • I workflow: incatenare i job con rami di successo e fallimento (28.5).
  • Gli altri mattoni: EE, scheduling, EDA (28.6).
  • Le buone abitudini con la piattaforma (28.7).

Come testarlo

Completa i TODO nei file di partenza, poi lancia il test della soluzione:

cd ansible/ed1/cap28/solution
./run.sh

Esito atteso

  • Il job template deploy è completo e ogni suo riferimento risolve (TODO 1): progetto, inventario, credenziale esistono e il playbook è nel progetto.
  • La concessione RBAC è al minimo privilegio (TODO 2): un ruolo stretto (execute) su una risorsa precisa (il job template), non admin su un'organizzazione.
  • Il workflow è un DAG ben formato con un ramo di fallimento verso il rollback (TODO 3).
  • Il validatore pre-import accetta il grafo: i riferimenti si risolvono, i segreti sono riferiti non scritti, l'accesso è scoped, il workflow è valido.