Con questo post iniziamo finalmente a parlare di uno degli argomenti principali del Configuration Management: il deploy.
Sulla scena esistono molti tool enterprise che occupano una grossa fetta di mercato come Puppet o Chef , ma io voglio parlarvi di un tool diverso: Ansible
Ansible is a radically simple IT orchestration engine that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications— automate in a language that approaches plain English, using SSH, with no agents to install on remote systems.
Ansible is the simplest way to automate and orchestrate
Come si può vedere già dalla descrizione dell’homepage del sito, la parola-chiave di Ansible è soprattutto semplicità.
A differenza di molti tool enterprise infatti Ansible non necessita in alcun modo di un agent installato sulle macchine da controllare, ma si basa su una semplice connessione ssh tra la macchina orchestrator e i nodi da controllare.
Vi basterà definire uno o piu utenti con cui collegarvi ai vostri nodi, e Ansible farà tutto il resto per voi. Potrete decidere se eseguire i comandi in modalità utente o “sudo” o anche alternare le due a seconda dei comandi che dovere lanciare.
I prerequisiti di funzionamento sono davvero minimali, il solo set di librerie base Python e in pochissimi casi qualche plugin aggiuntivo per la gestione di alcuni moduli, come nel caso di python-mysql.
L’installazione del tool vero e proprio può essere eseguita tramite tutti i principali pacchetti/tool unix e mac, anche se vi consiglio di appoggiarvi direttamente al repository GitHub in quanto la community di sviluppo è estremamente attiva e mi è capitato personalmente di esporre un problema sul sito e vedermi pronto il commit di fix nel giro di poche ore.
Inoltre l tool prevede sia una installazione “standard” sia la possibilità di avere una versione “sandbox” per sperimentare un determinato ramo di sviluppo senza toccare l’installazione ufficiale.
Il linguaggio di definizione dei “playbook” è YAML, un linguaggio di serializzazione “human-readable” che inizialmente può apparire un pò criptico da padroneggiare (principalmente anche a causa di qualche esempio outdated nelle guide), ma che rende la lettura delle istruzioni estremamente facile da comprendere anche da chi non è un esperto del tool.
L’intera gestione della procedura di deploy è demandata ad un ampia gamma di moduli che permettono di gestire dall’installazione di pacchetti standard (rpm, deb,etc..), alla copia/manipolazione di files, fino alla gestione di database, utenti e molto altro.
La quantità di task a disposizione è davvero vasta e in continua crescita grazie alla community, con poche righe di codice è possibile ottenere degli ottimi risultati.
Un altro aspetto molto interessante è la gestione e l’organizzazione dei files di configurazione e dei playbook.
E’ infatti possibile creare diverse configurazioni sfruttando la categorizzazione per gruppi di hosts, per le loro funzioni (database, webserver,etc..) e/o per gruppi custom.
Ciascun raggruppamento ha una sua priorità di lettura e viene naturale sfruttare l’override delle variabili per ottenere in un colpo solo i vantaggi di una gerarchia ereditaria e la gestione delle eccezioni e eventuali particolarità dei singoli host.
Le best practice sul riutilizzo di procedure e playbook sono molto ben documentate e estremamente incoraggiate fin dai primi tutorial e su git si possono trovare playbook di esempio per ciascuna delle funzionalità dei moduli ufficiali e per i task più comuni che un utente potrebbe trovarsi a voler implementare.
Ultimo punto da non trascurare è l’aspetto delle performance: l’estrema semplicità del modello garantisce infatti un ottima resa, in pochi minuti l’engine è in grado di eseguire processi complessi girando in parallelo su un numero virtualmente illimitato di nodi.
Tenendo fede alla sua natura di semplicità, Ansible opera principalmente da riga di comando, ma il team più “commerciale” di AnsibleWorks ha recentemente (Luglio 2013) rilasciato una UI Web piuttosto interessante: Ansible AWX.
Il progetto è ancora piuttosto acerbo e sinceramente vi consiglio di imparare prima a padroneggiare l’engine da command-line o potreste non apprezzare appieno le sue potenzialità per colpa di un interfaccia web che, per quanto comoda e ben fatta, ancora non fornisce un valore aggiunto al prodotto.
La versione free di AWX si è recentemente aggiornata alla versione 1.3 contestualmente al rilascio ufficiale anche di Ansible stesso (che però ha già sfornato una 1.3.1 e una 1.3.2 pochissimi giorni dopo) e consente un utilizzo totale delle funzionalità, seppur limitato ad un numero massimo di 10 nodi. (limite del tutto assente nell’engine Ansible). per passare ad un numero illimitato dovrete acquistare la licenza commerciale.
Nei prossimi post cercheremo di illustrare qualche esempio dei task in cui Ansible riesce a dare il meglio di se: installare in parallelo un set di pacchetti standard su un vasto pool di macchine (anche di diversa natura come RedHat/Ubuntu ) applicando anche le configurazioni necessarie su filesystem, ma vedremo anche come deployare un nostro applicativo, buildato da un Continuos integration tool come Jenkins/Bamboo facendo ripartire gli ambienti, effettuando il backup della versione precedente e patchando il database.
A presto!
Pingback: Fixing Heartbleed with Ansible | Around the Code
Pingback: Artifactory in the box | Around the Code
Pingback: Environment templates – part 3 – Deploy | Around the Code