Tutorial sui burattini per principianti: cos'è Puppet e come usarlo?

Prima di imparare Puppet, capiamo:

Che cos'è la gestione della configurazione?

La gestione della configurazione è il processo di mantenimento del software e dei sistemi informatici (ad esempio server, storage, reti) in uno stato noto, desiderato e coerente. Consente inoltre l'accesso a un registro storico accurato dello stato del sistema per scopi di gestione e audit del progetto.

Gli amministratori di sistema eseguono principalmente attività ripetitive come l'installazione di server, la configurazione di tali server, ecc. Questi professionisti possono automatizzare questa attività scrivendo script.

Tuttavia, è un lavoro difficile quando si lavora su un’infrastruttura enorme. Per risolvere tali problemi è stato introdotto lo strumento di gestione della configurazione come un burattino.

Cos'è il burattino?

Fantoccio è uno strumento di gestione del sistema per centralizzare e automatizzare il processo di gestione della configurazione. Puppet viene utilizzato anche come strumento di distribuzione del software. È un software di gestione della configurazione open source ampiamente utilizzato per la configurazione, la gestione, la distribuzione e l'orchestrazione del server di varie applicazioni e servizi nell'intera infrastruttura di un'organizzazione.

Puppet è appositamente progettato per gestire la configurazione di Linux e Windows sistemi. È scritto in Ruby e utilizza la sua unicità Dprincipale Specifici Llingua (DSL) per descrivere la configurazione del sistema.

Quali sono le versioni Puppet?

Il burattino è disponibile in due versioni:

  • Marionetta Open Source: è una versione base dello strumento di gestione della configurazione Puppet, noto anche come Open Source Puppet. È disponibile direttamente dal sito Web di Puppet ed è concesso in licenza con il sistema Apache 2.0.
  • Impresa di marionette: Versione commerciale che offre funzionalità come reporting di conformità, orchestrazione, controllo degli accessi basato sui ruoli, GUI, API e strumenti da riga di comando per una gestione efficace dei nodi.

Cosa può fare Puppet?

Ad esempio, hai un'infrastruttura con circa 100 server. In qualità di amministratore di sistema, è tuo ruolo garantire che tutti questi server siano sempre aggiornati e funzionanti con tutte le funzionalità.

Amministratore di sistema che lavora manualmente sui server
Amministratore di sistema che lavora manualmente sui server

Per fare ciò puoi utilizzare Puppet, che ti permette di scrivere un semplice codice che può essere distribuito automaticamente su questi server. Ciò riduce lo sforzo umano e rende il processo di sviluppo rapido ed efficace.

Puppet automatizza la gestione dei server
Puppet automatizza la gestione dei server

La marionetta svolge le seguenti funzioni:

  • Puppet ti consente di definire configurazioni distinte per ogni host.
  • Lo strumento consente di monitorare continuamente i server per confermare se la configurazione richiesta esiste o meno e non viene alterata. Se la configurazione viene modificata, lo strumento Puppet ripristinerà la configurazione predefinita sull'host.
  • Fornisce inoltre il controllo su tutto il sistema configurato, quindi una modifica centralizzata viene effettuata automaticamente.
  • Viene utilizzato anche come strumento di distribuzione poiché distribuisce automaticamente il software nel sistema. Implementa il infrastruttura come codice perché le politiche e le configurazioni sono scritte come codice.

Puppet DSL e paradigmi di programmazione

Prima di apprendere Puppet DSL, comprendiamo i paradigmi di programmazione:

Un paradigma di programmazione è uno stile che utilizzi nella programmazione del computer.

Quattro tipi di paradigmi sono:

  • Imperativo.
  • Dichiarativo.
  • Funzionale (che è considerato un sottoinsieme di quel paradigma dichiarativo)
  • Orientato agli oggetti.

Ci concentreremo su imperativo e dichiarativo.

Paradigmi imperativi

Questo paradigma di programmazione esprime la logica di un calcolo (Cosa fare) e descrive il suo flusso di controllo (Come fare)

Esempio:

Supponiamo che tu stia andando in ufficio, prenoti un taxi e inizi a dare indicazioni passo passo all'autista fino a raggiungere l'ufficio. Specificare cosa fare e come farlo è uno stile imperativo.

Paradigmi dichiarativi

Questo paradigma di programmazione esprime la logica di un calcolo (Cosa fare) senza descriverne il flusso di controllo (Come fare)

Esempio:

Supponiamo che tu stia andando al tuo ufficio, prenoti un taxi Uber e specifichi la destinazione finale (Ufficio). Specificare cosa fare e non come fare è uno stile dichiarativo.

Paradigma Cosa fare Come fare
imperativo Si Si
Dichiarativo Si Non

Puppet utilizza un paradigma di programmazione dichiarativa

Puppet utilizza un approccio di programmazione dichiarativo.

Esempio: Creare un utente sul sistema:

Può essere fatto utilizzando il modello di programmazione imperativo tramite uno script di shell: qui specifichiamo come creare l'utente e quali comandi utilizzare sul sistema operativo.

Paradigmi dichiarativi

Tuttavia, è possibile farlo utilizzando il modello di programmazione dichiarativo con solo poche righe di codice pupazzo, linguaggio specifico del dominio Puppet (DSL) e ottenendo comunque lo stesso risultato.

Paradigmi dichiarativi

Modelli di distribuzione degli strumenti di gestione della configurazione

Esistono due modelli di distribuzione per strumenti di gestione della configurazione :

  • Modello di distribuzione basato su push: avviato da un nodo master.
  • Modello di distribuzione basato su pull: avviato dagli agenti.

Modello di distribuzione basato su push

In questo modello di distribuzione il server master invia le configurazioni e il software ai singoli agenti. Dopo aver verificato una connessione sicura, il master esegue i comandi in remoto sugli agenti. Per esempio, ansible e pila di sale.

Modello di distribuzione basato su pull.

In questo modello di distribuzione, i singoli server contattano un server master, verificano e stabiliscono una connessione sicura, scaricano le proprie configurazioni e software e quindi si configurano di conseguenza, ad esempio Puppet e Chef.

Come funziona Puppet?

Puppet si basa su un modello di distribuzione Pull, in cui i nodi agente effettuano il check-in regolarmente dopo ogni 1800 secondi con il nodo master per vedere se è necessario aggiornare qualcosa nell'agente. Se è necessario aggiornare qualcosa, l'agente estrae i codici pupazzo necessari dal master ed esegue le azioni richieste.

Spieghiamolo con un esempio:

Esempio: Impostazione Master – Agente:

Il Maestro

Una macchina basata su Linux su cui è installato il software Puppet Master. È responsabile del mantenimento delle configurazioni sotto forma di codici fantoccio. Il nodo master può essere solo Linux.

Gli agenti

Le macchine target gestite da un pupazzo su cui è installato il software dell'agente pupazzo.

L'agente può essere configurato su qualsiasi sistema operativo supportato come Linux o Windows or Solaris o sistema operativo Mac.

La comunicazione tra master e agent viene stabilita tramite certificati sicuri.

Comunicazione dell'agente burattinaio
Comunicazione dell'agente burattinaio

Comunicazione tra il Master e l'Agente

Passo 1) Una volta stabilita la connettività tra l'agente e il master, l'agente Puppet invia i dati sul suo stato al server Puppet master. Questi sono chiamati Facts: queste informazioni includono il nome host, i dettagli del kernel, l'indirizzo IP, i dettagli del nome del file, ecc.

Comunicazione tra il Master e l'Agente
L'agente invia i fatti al master

Passo 2) Puppet Master utilizza questi dati e compila un elenco con la configurazione da applicare all'agente. Questo elenco di configurazioni da eseguire su un agente è noto come a catalogare. Questo potrebbe essere modificato come installazione di pacchetti, aggiornamenti o rimozioni, creazione di file system, creazione o eliminazione di utenti, riavvio del server, modifiche alla configurazione IP, ecc.

Comunicazione tra il Master e l'Agente
Il Master invia un catalogo all'Agente

Passo 3) L'agente utilizza questo elenco di configurazioni per applicare eventuali modifiche di configurazione richieste sul nodo.

Nel caso in cui non vi siano derive nella configurazione, l'Agent non esegue alcuna modifica alla configurazione e lascia il nodo in esecuzione con la stessa configurazione.

Comunicazione tra il Master e l'Agente
L'agente applica la configurazione

Passo 4) Una volta terminato, il nodo riporta al burattinaio indicando che la configurazione è stata applicata e completata.

Blocchi di marionette

Puppet offre la flessibilità necessaria per integrare i report con strumenti di terze parti utilizzando le API Puppet.

Sono quattro tipi di elementi costitutivi delle marionette

  1. Risorse
  2. Classi
  3. Manifesto
  4. moduli

Risorse per burattini

Le risorse di Puppet sono gli elementi costitutivi di Puppet.

Le risorse sono funzioni integrate che vengono eseguiti nel back-end per eseguire le operazioni richieste in pupazzo.

Corsi di marionette

Una combinazione di diverse risorse può essere raggruppata in un'unica unità chiamata classe.

Manifesto dei burattini

Manifest è una directory contenente file DSL pupazzi. Questi file hanno un'estensione .pp. L'estensione .pp sta per programma pupazzo. Il codice pupazzo è costituito da definizioni o dichiarazioni di classi pupazzo.

Moduli di marionette

I moduli sono una raccolta di file e directory come manifesti, definizioni di classi. Sono le unità riutilizzabili e condivisibili in Puppet.

Ad esempio, al cotone biologico viene applicata l'etichetta MySQL modulo da installare e configurare MySQL oppure il modulo Jenkins per gestire Jenkins, ecc..

Moduli di marionette
Moduli di marionette

Tipi di risorse Puppet

In generale, un sistema è costituito da file, utenti, servizi, processi, pacchetti, ecc. In Puppet questi sono chiamati risorse. Le risorse sono gli elementi costitutivi fondamentali

Fantoccio. Tutte le operazioni sugli agenti fantoccio vengono eseguite con l'aiuto delle risorse fantoccio.

Le risorse Puppet sono gli strumenti già pronti che vengono utilizzati per eseguire vari task e operazioni su qualsiasi piattaforma supportata. Possiamo utilizzare una singola risorsa Puppet per eseguire un task specifico, oppure possiamo utilizzare più risorse Puppet insieme per eseguire alcune distribuzioni di configurazioni di applicazioni complesse.

Le risorse possono avere diversi tipi. Usi delle marionette risorse e tipi di risorse per descrivere la configurazione di un sistema.

Esistono tre tipi di tipi di risorse:

  1. Tipi di risorse Puppet Core o integrate.
  2. Tipi di risorse definiti dal burattino.
  3. Tipi di risorse personalizzate pupazzo.

Tipi di risorse Puppet Core o integrate

I tipi di risorse core o incorporati sono i tipi di risorse pupazzo precostruiti forniti con il software pupazzo. Tutti i tipi di risorse Puppet principali o integrati sono scritti e gestiti dal team Puppet.

Tipi di risorse definiti dal burattino

I tipi di risorse definiti sono tipi di risorse leggeri scritti nel linguaggio dichiarativo Puppet utilizzando una combinazione di tipi di risorse esistenti.

Tipi di risorse personalizzate pupazzo

I tipi di risorse personalizzati sono tipi di risorse completamente personalizzati scritti in Ruby.

Esploriamo i tipi di risorse pupazzo...

Nel terminale, digitare il seguente comando per visualizzare un elenco dei sottocomandi rilevanti per Puppet:

Puppet --help

Tipi di risorse personalizzate pupazzo

Nel nostro caso a noi interessa il sottocomando “risorsa" che utilizzeremo per trovare informazioni sui tipi di risorse pupazzo incorporati.

Nel terminale, digitare uno dei seguenti comandi per visualizzare un elenco di azioni associato al sottocomando fantoccio “risorsa"

Puppet help resource		
Puppet resource --help		

Tipi di risorse personalizzate pupazzo

In questo caso, abbiamo il risorsa come sottocomando e –tipi come azione.

Puppet ha 49 tipi di risorse principali integrati.

Nel terminale, digitare il seguente comando per visualizzare un elenco dei tipi di risorse puppet integrate disponibili:

puppet resource –types

Tipi di risorse personalizzate pupazzo

Ogni tipo supporta un elenco di gli attributi. Questi attributi forniscono una descrizione dettagliata che Puppet utilizza per gestire la risorsa.

Per scoprire tutti gli attributi associati al tipo di risorsa pupazzo, utilizzare il seguente comando:

puppet describe <resource type name>	

I parametri elencheranno tutti gli attributi disponibili per quel tipo di risorsa.

il burattino descrive il pacchetto

Tipi di risorse personalizzate pupazzo

È difficile per una persona nuova comprendere e mettere in relazione molti file di codice pupazzo non gestiti. È qui che abbiamo bisogno di un raggruppamento per collegare insieme le operazioni. Lo scopo è risolvere un singolo problema, ad esempio tutte le operazioni necessarie per configurare da zero ssh su un server o un servizio ntp o un server web completo o un server database.

Cosa sono le classi di marionette?

Le classi di marionette sono la raccolta di risorse di marionette raggruppate insieme come una singola unità.

Puppet ha introdotto classi per rendere la struttura riutilizzabile e organizzata.

Per prima cosa dobbiamo definire una classe utilizzando la sintassi di definizione della classe; le classi devono essere uniche e possono essere dichiarate una sola volta con lo stesso nome:

class <class-name> {
<Resource declarations>
}

Esempio:

class ntpconfig {
    file {
        "/etc/ntp.conf": 
     ensure=> "present", content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}

Finora abbiamo solo definito la classe, ma non l'abbiamo usata da nessuna parte. Ciò significa che il codice che abbiamo scritto non verrà mai eseguito a meno che non dichiariamo questa classe altrove.

Dichiarazione di classe

Per utilizzare una classe definita nel codice, utilizzare il file includere parola chiave.

class ntpconfig {
    file {
        "/etc/ntp.conf": 
      ensure=> "present", 
      content=> "server 0.centos.pool.ntp.org iburst\n",
    }
}
include ntpconfig

Capiamolo con uno scenario di caso reale.

Installazione demo NTP

Per prima cosa, assicurati che il pacchetto NTP non sia già presente sul server, il seguente comando non restituirà nulla se il telnet non è presente sul server:

rpm -qa | grep -i ntp

Demo Installa NTP

Come possiamo vedere, il pacchetto NTP è già presente sul server. Rimuoviamo il pacchetto NTP esistente:

yum remove ntp

Dopo aver rimosso il pacchetto, assicurati che il file ntp.conf non esista:

ls -lrt /etc/ntp.conf

Demo Installa NTP

Verificare che il servizio ntp non esista eseguendo il seguente comando:

systemctl status ntp

Demo Installa NTP

Crea un nuovo file .pp per salvare il codice. Dalla riga di comando:

vi demontp.pp

Passare alla modalità di inserimento premendo i dalla tastiera.

Digitare il seguente codice per creare un nuovo file:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

Dopo aver terminato la modifica: premere esc

Per salvare il file, premere :wq!

Il prossimo passo è dai un'occhiata se il codice presenta errori di sintassi. Esegui il seguente comando:

puppet parser validate demontp.pp

Assicurati di essere passato a radice per poter completare il test senza alcun errore, eseguendo il comando:

su root

Test è il passo successivo nel processo di creazione del codice. Esegui il seguente comando per effettuare uno smoke test:

Puppet applies demontp.pp --noop

L'ultimo passo è eseguire il il pupazzo in modalità reale e verificare l'output.

puppet apply demontp.pp

Puppet non ha eseguito nulla perché la lezione dimostrativa era giusta definito ma non dichiarata.

Quindi, finché non dichiari la classe pupazzo, il codice non verrà applicato.

Diamo dichiarare la classe demo all'interno dello stesso codice utilizzando includere il nome della classe alla fine del codice:

# Class Definition 
class ntpconfig {
    # Installing NTP Package 
  package {"ntp": 
    ensure=> "present",
    }
    # Configuring NTP configuration file 
  file {"/etc/ntp.conf": 
    ensure=> "present", 
    content=> "server 0.centos.pool.ntp.org iburst\n",
    }
    # Starting NTP services 
  service {"ntpd": 
    ensure=> "running",
    }
}

# Class Declaration 
include ntpconfig

Di nuovo dai un'occhiata se il codice presenta errori di sintassi. Esegui il seguente comando:

puppet parser validate demontp.pp

Assicurati di essere passato a radice per poter completare il test senza alcun errore, eseguendo il comando:

su root

Testing è il passo successivo nel processo di creazione del codice. Esegui il seguente comando per effettuare uno smoke test:

Puppet apply demontp.pp --noop

L'ultimo passo è eseguire il il pupazzo in modalità reale e verificare l'output.

puppet apply demontp.pp

Questa volta il codice viene applicato perché la classe è stata definita e quindi dichiarata.

Demo Installa NTP

Assicurati che ntp.conf sia ora esistente:

ls -lrt /etc/ntp.conf

Verificare che il servizio ntp sia stato avviato eseguendo il seguente comando:

systemctl status ntpd

Demo Installa NTP