Tutorial di marionette per principianti: nozioni di base e linguaggio DSL
โก Riepilogo intelligente
Puppet รจ una piattaforma open-source per la gestione della configurazione che automatizza il provisioning, la configurazione e la coerenza dei server. Applica il concetto di infrastruttura come codice attraverso un linguaggio dichiarativo specifico del dominio, sostituendo le ripetitive attivitร amministrative manuali su grandi flotte di server.

Puppet รจ uno strumento open source per la gestione della configurazione che consente di definire l'infrastruttura come codice e di mantenere grandi gruppi di server in uno stato coerente e ripetibile. Prima di imparare a usare Puppet, cerchiamo di capire cosa si intende per gestione della configurazione.
Che cos'รจ la gestione della configurazione?
La gestione della configurazione รจ il processo di mantenimento di software e sistemi informatici, come server, sistemi di archiviazione e reti, in uno stato noto, desiderato e coerente. Fornisce inoltre l'accesso a una registrazione storica accurata dello stato del sistema a fini di gestione dei progetti e di audit.
Gli amministratori di sistema svolgono per lo piรน attivitร ripetitive, come l'installazione e la configurazione dei server. Questi professionisti possono automatizzare questo lavoro scrivendo script.
Tuttavia, questo diventa un compito arduo quando si lavora su un'infrastruttura di grandi dimensioni. Strumenti di gestione della configurazione come Puppet sono stati introdotti per risolvere questi problemi.
Cos'รจ il burattino?
Fantoccio Puppet รจ 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.
Si tratta di un software open source per la gestione della configurazione, ampiamente utilizzato per la configurazione, la gestione, la distribuzione e l'orchestrazione di diverse 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 SourceSi tratta di una versione base dello strumento di gestione della configurazione Puppet, noto anche come Open Source Puppet. ร disponibile direttamente sul sito web di Puppet ed รจ distribuito con licenza Apache 2.0.
- Puppet Enterprise: Una versione commerciale che offre funzionalitร quali report di conformitร , orchestrazione, controllo degli accessi basato sui ruoli, un'interfaccia grafica, un'API e strumenti da riga di comando per la gestione efficace dei nodi.
Cosa puรฒ fare Puppet?
Ad esempio, supponiamo di avere un'infrastruttura con circa 100 server. In qualitร di amministratore di sistema, il tuo ruolo รจ quello di garantire che tutti questi server siano sempre aggiornati e funzionino a pieno regime.

Per fare ciรฒ, รจ possibile utilizzare Puppet, che consente di scrivere codice semplice che puรฒ essere distribuito automaticamente su questi server. Questo riduce lo sforzo umano e rende il processo di sviluppo rapido ed efficace.

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 verificare che la configurazione richiesta sia presente e non sia stata modificata. Se la configurazione viene modificata, Puppet ripristina la configurazione predefinita sull'host.
- Offre inoltre il controllo su ogni sistema configurato, in modo che una modifica centralizzata venga automaticamente applicata ovunque.
- Viene anche utilizzato come strumento di distribuzione, perchรฉ distribuisce automaticamente il software nel sistema. Implementa Infrastruttura come codice, perchรฉ le politiche e le configurazioni sono scritte come codice.
Puppet DSL e paradigmi di programmazione
Prima di imparare il DSL di Puppet, cerchiamo di capire i paradigmi di programmazione. Un paradigma di programmazione รจ uno stile che si utilizza nella programmazione informatica.
Quattro tipi di paradigmi sono:
- Imperativo.
- Dichiarativo.
- Funzionale (che รจ considerato un sottoinsieme del paradigma dichiarativo).
- Orientato agli oggetti.
Ci concentreremo sui paradigmi imperativo e dichiarativo.
Paradigmi imperativi
Questo paradigma di programmazione esprime la logica di un calcolo (cosa fare) e ne descrive anche il flusso di controllo (come farlo).
Esempio:
Supponiamo che tu debba andare in ufficio. Prenoti un taxi e inizi a dare istruzioni dettagliate all'autista fino a quando non arrivi a destinazione. 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 farlo).
Esempio:
Supponiamo che tu debba andare in ufficio. Prenoti un taxi Uber e specifichi solo la destinazione finale (l'ufficio). Specificare cosa fare, ma non come farlo, รจ 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 nel sistema.
Puรฒ essere fatto utilizzando un modello di programmazione imperativo con uno script di shell. Qui specifichiamo come creare l'utente e quali comandi utilizzare su di esso sistema operativo.
Tuttavia, รจ possibile farlo anche utilizzando un modello di programmazione dichiarativa con poche righe di codice Puppet e il linguaggio specifico di dominio (DSL) di Puppet, ottenendo comunque lo stesso risultato.
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. Ad esempio, ansible e pila di sale.
modello di implementazione basato sulla richiesta
In questo modello di distribuzione, i singoli server contattano un server master, verificano e stabiliscono una connessione sicura, scaricano le proprie configurazioni e il 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 verificare se รจ necessario aggiornare qualcosa sull'agente. Se รจ necessario un aggiornamento, l'agente scarica il codice Puppet necessario dal master ed esegue le azioni richieste.
Spieghiamolo con un esempio di configurazione master-agente.
Il Maestro
Si tratta di una macchina basata su Linux con il software Puppet master installato. ร responsabile della gestione delle configurazioni sotto forma di codice Puppet. Il nodo master puรฒ essere solo Linux.
Gli agenti
Si tratta delle macchine target gestite da Puppet, su cui รจ installato il software agente di Puppet.
L'agente puรฒ essere configurato su qualsiasi sistema operativo supportato, come Linux, Windows, Solariso Mac OS.
La comunicazione tra il master e l'agente viene stabilita tramite certificati sicuri.

Comunicazione tra il Master e l'Agente
Passo 1) Una volta stabilita la connettivitร tra l'agente e il master, l'agente Puppet invia al server master Puppet i dati relativi al proprio stato. Questi dati, chiamati "Fact", includono il nome host, i dettagli del kernel, l'indirizzo IP, i dettagli del nome del file e cosรฌ via.

Passo 2) Il master Puppet utilizza questi dati e compila un elenco della configurazione da applicare all'agente. Questo elenco di configurazioni da eseguire su un agente รจ noto come catalogoPotrebbe includere l'installazione, l'aggiornamento o la rimozione di pacchetti, la creazione del file system, la creazione o l'eliminazione di utenti, il riavvio del server, le modifiche alla configurazione IP e cosรฌ via.
Passo 3) L'agente utilizza questo elenco di configurazioni per applicare eventuali modifiche di configurazione richieste sul nodo.
Se non si riscontrano variazioni nella configurazione, l'agente non apporta alcuna modifica e lascia il nodo in esecuzione con la configurazione invariata.

Passo 4) Una volta completata l'operazione, il nodo invia un messaggio al master di Puppet, 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 di Puppet.
Esistono quattro tipi di elementi costitutivi per le marionette:
- Risorse
- Classi
- Manifesto
- moduli
Risorse per burattini
Le risorse di Puppet sono gli elementi costitutivi di Puppet.
Le risorse sono funzioni integrate che vengono eseguiti in background per svolgere le operazioni richieste in Puppet.
Corsi di marionette
Una combinazione di risorse diverse puรฒ essere raggruppata in un'unica unitร chiamata classe.
Manifesto dei burattini
Un manifesto รจ una directory contenente file Puppet DSL. Questi file hanno estensione .pp, che sta per programma Puppet. Il codice Puppet รจ costituito da definizioni o dichiarazioni di classi Puppet.
Moduli di marionette
I moduli sono insiemi di file e directory, come ad esempio manifest e definizioni di classi. Rappresentano le unitร riutilizzabili e condivisibili di Puppet.
Ad esempio, al cotone biologico viene applicata l'etichetta MySQL il modulo installa e configura MySQL Jenkins il modulo gestisce Jenkins.

Tipi di risorse Puppet
In generale, un sistema รจ costituito da file, utenti, servizi, processi, pacchetti e cosรฌ via. In Puppet, questi elementi sono chiamati risorse e rappresentano i blocchi costitutivi fondamentali di Puppet.
Tutte le operazioni sugli agenti Puppet vengono eseguite con l'ausilio delle risorse Puppet.
Le risorse Puppet sono strumenti predefiniti utilizzati per eseguire diverse attivitร e operazioni su qualsiasi piattaforma supportata. Possiamo utilizzare una singola risorsa Puppet per svolgere un'attivitร specifica, oppure possiamo utilizzare piรน risorse Puppet insieme per eseguire implementazioni di configurazione applicativa complesse.
Le risorse possono avere diversi tipi. Usi delle marionette risorse and tipi di risorse per descrivere la configurazione di un sistema.
Esistono tre tipi di tipi di risorse:
- Tipi di risorse Puppet Core o integrate.
- Tipi di risorse definiti dal burattino.
- Tipi di risorse personalizzate pupazzo.
Tipi di risorse Puppet Core o integrate
I tipi di risorse di base o integrati sono i tipi di risorse Puppet predefiniti forniti con il software Puppet. Tutti i tipi di risorse di base o integrati di Puppet sono scritti e gestiti dal team di 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 ulteriormente i tipi di risorse di Puppet.
Nel terminale, digita il seguente comando per visualizzare un elenco di sottocomandi relativi a Puppet:
Puppet --help
Nel nostro caso a noi interessa il sottocomando โrisorsa", che useremo per trovare informazioni sui tipi di risorse Puppet integrati.
Nel terminale, digitare uno dei seguenti comandi per visualizzare un elenco di azioni associato al sottocomando Puppet โrisorsa"
Puppet help resource Puppet resource --help
In questo caso, abbiamo risorsa come sottocomando e โtipi come azione.
Puppet ha 49 tipi di risorse principali integrati.
Nel terminale, digita il seguente comando per visualizzare un elenco dei tipi di risorse Puppet predefinite disponibili:
puppet resource โtypes
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 a un tipo di risorsa Puppet, 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
Per una persona nuova รจ difficile comprendere e collegare molti file di codice Puppet non gestiti. ร qui che abbiamo bisogno di un po' di gruppoping Collegare tra loro le operazioni. L'obiettivo รจ risolvere un singolo problema, come ad esempio tutte le operazioni necessarie per configurare SSH su un server, un servizio NTP o un server web o di database completo partendo da zero.
Cosa sono le classi di marionette?
Le classi Puppet sono insiemi di risorse Puppet raggruppate in un'unica unitร .
Puppet ha introdotto classi per rendere la struttura riutilizzabile e organizzata.
Innanzitutto, dobbiamo definire una classe utilizzando la sintassi di definizione della classe. Le classi devono essere univoche 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; non l'abbiamo ancora utilizzata 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 tuo codice, usa includere parola chiave.
class ntpconfig {
file {
"/etc/ntp.conf":
ensure=> "present",
content=> "server 0.centos.pool.ntp.org iburst\n",
}
}
include ntpconfig
Cerchiamo di capirlo attraverso uno scenario reale.
Installazione demo NTP
Innanzitutto, assicurati che il pacchetto NTP non sia giร presente sul server. Il seguente comando non restituirร alcun risultato se il pacchetto NTP non รจ presente sul server:
rpm -qa | grep -i ntp
Come possiamo vedere, il pacchetto NTP รจ giร presente sul server. Procediamo quindi a rimuovere il pacchetto NTP esistente:
yum remove ntp
Dopo aver rimosso il pacchetto, assicurarsi che il file ntp.conf non esista piรน:
ls -lrt /etc/ntp.conf
Verifica che il servizio ntp non sia presente eseguendo il seguente comando:
systemctl status ntp
Crea un nuovo file .pp per salvare il codice. Dalla riga di comando:
vi demontp.pp
Passa alla modalitร di inserimento premendo il tasto i sulla 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",
}
}
Una volta terminata la modifica, premi Esc.
Per salvare il file, premere :wq!
Il prossimo passo รจ quello di dai un'occhiata se il codice presenta errori di sintassi. Esegui il seguente comando:
puppet parser validate demontp.pp
Assicurati di essere passato al radice l'utente deve essere in grado di 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 รจ quello di eseguire il Avviare la marionetta in modalitร reale e verificarne l'output.
puppet apply demontp.pp
Il burattino non ha eseguito nulla perchรฉ la classe demo era solo definito ma non dichiarata.
Pertanto, finchรฉ non dichiari la classe Puppet, il codice non verrร applicato.
Cerchiamo di 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
Ancora, dai un'occhiata se il codice presenta errori di sintassi. Esegui il seguente comando:
puppet parser validate demontp.pp
Assicurati di essere passato al radice l'utente deve essere in grado di completare il test senza alcun errore, eseguendo il comando:
su root
Collaudo รจ 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 รจ quello di eseguire il Avviare la marionetta in modalitร reale e verificarne l'output.
puppet apply demontp.pp
Questa volta, il codice viene applicato perchรฉ la classe รจ stata definita e poi dichiarata.
Assicurati che il file ntp.conf esista ora:
ls -lrt /etc/ntp.conf
Verifica che il servizio ntp sia stato avviato eseguendo il seguente comando:
systemctl status ntpd











