Indice articolo

Se si vuole essere competitivi bisogna anche giocare d’astuzia. Meglio processo manuale, lungo e ripetitivo o un processo veloce e altamente automatizzato? Se hai scelto la seconda, prosegui la lettura!

In questo articolo vedremo infatti come cambia l’approccio (e di conseguenza il processo) all’installazione di un’applicazione utilizzando l’IaC.

Introduzione

Qui sotto viene riportato uno schema verosimile dei passi necessari per poter fruire delle funzionalità del nostro frontend (WebUP).
Esso prevede che l’installatore effettui il setup e la manutenzione delle macchine su cui intendiamo installare le nostre applicazioni (nel migliore dei casi 1macchina, nel peggiore delle ipotesi come in questo caso più di una).
Dopodichè si passa ad una parte in cui la procedura prevede lo scaricamento, l’installazione e la configurazione di tutte le applicazioni di terze parti (java,payara ecc…) abbinato allo scaricamento, l’installazione e configurazione delle applicazioni proprietarie (nel nostro caso Provider e Webup che sono le nostre soluzioni di backend e frontend).
Il tutto con un esborso di tempo di circa 30-60min.

Nasce quindi la necessità di sostituire questo processo manuale lungo e ripetitivo con un qualcosa che fosse

  • Replicabile
  • Automatizzato
  • Agile
  • Gestibile e Manutenibile

Abbiamo basato quindi la nostra soluzione sul:

  • rendere l’installazione quasi priva dell’interazione utente (e quindi renderla industrializzabile)
  • utilizzare su soluzioni che rendessero le operazoni di installazioni idempotenti (ovvero replicabili)
  • adottare un approccio un pò più Cloud Driven per le nostre applicazioni, rendendole installabili allo stesso modo in cloud o on-premise
  • utilizzare strumenti di IaC per
    • provisioning
    • container orchestration
    • templating

IaC

Spieghiamo quindi il significato dell’acronimo IaC che significa Infrastructure as Code e se volessimo dargli un significato capibile ai più, potremmo ridurre all’osso la sua definizione con qualcosa del tipo: “gestione e provisioning dell’infrastruttura tramite codice”.

Cosa intendiamo però con provisioning?
Legata alla parola “provide” (fornire), il provisioning è l’azione che prevede la preparazione (fase di setup, installazione e configurazione) per la fornitura delle risorse dell’infrastruttura necessarie ad accogliere le applicazioni tramite codice e non tramite processi manuali.

E’ possibile identificare varie tipologie di IaC, che ne denotano inoltre anche gli ambiti in cui ricadono le scelte per l’utilizzo di un tool rispetto ad un altro, come ad esempio:

  • Declarative vs Imperative : l’approccio imperativo si basa sul “come” fare le cose e di conseguenza sarà necessario indicare passo passo le operazioni che dovranno essere fatte per la riuscita del risultato finale. La situazione dichiarativa invece predilige il “cosa”, che si esplica nel fatto di dichiarare il risultato finale che si vuole ottenere, ed i passi per arrivarci non saranno per forza chiari all’utente .
  • Agent vs Agentless: l’approccio agent prevede che venga installato un agent sulle macchine da gestire, mentre

I vari tool disponibili possono essere come già detto intrecciarsi ed andare a coprire solo alcuni ambiti di funzionamento, e tra i più citati ci sono:

  • Kubernetes
  • Terraform
  • Ansible
  • AWS CloudFormation
  • Azure Resource Manager
  • Google Cloud Deployment Manager
  • Chef
  • Puppet
  • Saltstack
  • Packer
  • Vagrant

che possono spaziare tra i vari ambiti qui :

  • Scripting e Configuration Management
  • Provisioning
  • Container e templating
  • Orchestration
  • ….

Vantaggi e Svantaggi

Ma perchè conviene utilizzare questa tecnologia, quali sono i reali vantaggi?

  • Riduzione degli errori: essendo codice che viene eseguito, sistemando il codice stesso si ha la possibilità di arrivare ad una situazione esente da errori. Essendo anche processi automatici, vengono totalmente esclusi gli errori manuali provocati dall’essere umano.
  • Velocità: maggior velocità sia di esecuzione che di develop e ciò porta anche ad una riduzione dei costi
  • Controllo: maggior controllo del flusso del processo proprio perchè è una successione di passi gestiti da codice e perchè il suddetto codice è versionato con un qualsiasi tool di version control.
  • Documentazione: alcuni software permettono di descrivere lo stato interno attuale dell’infrastruttura, il che rende autodocumentativo lo stato stesso della macchina
  • Riusabilità: essendo codice è di per sè (se scritto correttamente) riutilizzabile

Non esistono soluzioni perfette, quindi abbiamo anche degli svantaggi nell’adottare l’approccio IaC:

  • Utilizzo di software terzi: questo comporta la comprensione in prima istanza di cosa riesce a coprire il sofware scelto, dopodichè la comprensione del suo meta-linguaggio che ci permette di dagli istruzioni
  • Gli errori possono diffondersi rapidamente: essendo processi quasi totalmente automatizzati, nel caso ci siano errori nel codice, possono propagarsi in modo molto veloce nel sistema
  • Mantenimento del codice complesso: in alcuni casi, quando il codice inizia a diventare preponderante, si può incappare in situazioni di gestione del codice non indifferenti.

Esempio mediante IaC

Vediamo quindi come cambia il processo di installazione portato ad esempio precedentemente con l’adozione dell’IaC.

Avremo quindi 2 fasi che ho voluto distinguere :

  • una fase precedente ed “esterna” che prevede che il developer scriva la “ricetta” (o codice) che poi viene salvata su github. Dopodichè viene presa ed utilizzata da packer che, come detto, è uno strumento IaC che permette di fare templating e di creare le immagini che vengono poi messe a disposizione su un repository.
  • la fase affidata all’installatore sarà ora pressochè ridotta all’osso. Esso infatti si occuperà solo di reperire l’immagine prodotta e messa a disposizione sul repository ed importarla in un hypervisor (come hyperV, vmware, ecc…).
    Dopodichè sarà necessario solo lanciare un comando da terminale e vedersi affidata la gestione del provisioning e del container-orchestration a Terraform e Docker che agiranno in totale autonomia nella creazione delle risorse volute.
    La parte di monitoring sarà invece affidata a Saltstack.

Ora il tempo stimato dell’installazione dai 5 ai 10 minuti.

Per vedere la registrazione di questo speech e delle altre pillole, CLICCA QUI.