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.

  • ๐Ÿงฉ Gestione della configurazione: Puppet mantiene server, sistemi di archiviazione e reti in uno stato noto e coerente, conservando una cronologia verificabile di ogni modifica.
  • ???? ๏ธ Agente principale Architecnologia: Un master Linux compila cataloghi e agenti su Linux, Windows, Solarisoppure Mac OS li applica tramite certificati sicuri.
  • ๐Ÿ”„ Modello di trazione: Gli agenti effettuano un check-in ogni 1800 secondi, scaricano il codice Puppet necessario e correggono eventuali discrepanze di configurazione sul nodo.
  • ๐Ÿง  DSL dichiarativo: Scritto in Ruby, Puppet utilizza un linguaggio dichiarativo, quindi si definisce lo stato finale desiderato anzichรฉ impartire comandi passo passo.
  • ๐Ÿงฑ Costruzioni: Risorse, classi, manifest e moduli strutturano il codice riutilizzabile, con 49 tipi di risorse di base integrati disponibili per impostazione predefinita.
  • โš™๏ธ Esempio pratico di NTP: Definisci e dichiara una classe, convalidala con `puppet parser validate`, quindi applica il manifest usando `puppet apply`.

Tutorial di Puppet che spiega le basi della gestione della configurazione, l'architettura master-agente e il DSL dichiarativo.

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.

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

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.

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 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.

Paradigmi dichiarativi

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.

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. 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 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 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.

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

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.

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.

Se non si riscontrano variazioni nella configurazione, l'agente non apporta alcuna modifica e lascia il nodo in esecuzione con la configurazione invariata.

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

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:

  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 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.

Moduli di marionette
Moduli di marionette

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:

  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 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

Tipi di risorse personalizzate pupazzo

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		

Tipi di risorse personalizzate pupazzo

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

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 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

Tipi di risorse personalizzate pupazzo

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

Demo Installa 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

Demo Installa NTP

Verifica che il servizio ntp non sia presente 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

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.

Demo Installa NTP

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

Demo Installa NTP

DOMANDE FREQUENTI

Puppet รจ scritto in Ruby. Utilizza un proprio linguaggio specifico di dominio (DSL) dichiarativo che consente agli amministratori di descrivere lo stato desiderato del sistema anzichรฉ dover programmare ogni singolo passaggio. Il DSL di Puppet si ispira a Ruby, ma non รจ necessario conoscere Ruby per scrivere i manifest.

Puppet utilizza un modello pull dichiarativo basato su agenti e un proprio DSL, pertanto i nodi recuperano i cataloghi da un master. ansible รˆ senza agenti e invia playbook YAML tramite SSH. Puppet รจ adatto all'applicazione dello stato a lungo termine, mentre Ansible รจ piรน semplice per un'orchestrazione rapida e su richiesta.

Per impostazione predefinita, il master di Puppet, chiamato anche Puppet Server, รจ in ascolto sulla porta TCP 8140. Gli agenti Puppet si connettono a questa porta tramite HTTPS per inviare i dati e scaricare i cataloghi compilati. Assicurarsi che la porta 8140 sia aperta nel firewall tra gli agenti e il master.

Il master di Puppet deve essere eseguito su Linux. Gli agenti di Puppet vengono eseguiti su molte piattaforme, incluso Linux, Windows, Solarise Mac OS. Questo supporto multipiattaforma per gli agenti consente a un singolo master Puppet di gestire un parco macchine misto, composto da server e workstation, da un'unica postazione centrale.

Puppet Forge รจ il repository pubblico di moduli Puppet precompilati condivisi da Puppet e dalla community. Invece di scrivere manifest da zero, puoi scaricare moduli che installano e configurano software come MySQL or Jenkins, quindi adattali al tuo ambiente.

Sรฌ. Puppet rimane uno strumento ampiamente utilizzato per la gestione della configurazione e l'infrastruttura come codice, ora gestito da Perforce. Puppet 8 รจ l'attuale versione principale e supporta ancora sia Puppet Open Source che la versione commerciale. Puppet Enterprise per la gestione di flotte di server su larga scala.

Gli assistenti IA possono generare Puppet DSL da prompt in linguaggio naturale, spiegare manifest esistenti e segnalare errori di sintassi o logica prima di eseguire puppet parser validate. Strumenti come ChatGPT Velocizza il processo di authoring, ma rivedi sempre le risorse generate per verificare la correttezza dei percorsi e l'idempotenza.

Sรฌ. Le serrature scorrevoli portatili e i catenacci a superficie possono essere usati per mettere in sicurezza una porta a scomparsa dall'esterno. Alcuni kit con catena di sicurezza consentono anche il bloccaggio esterno con chiave o manopola girevole. Copilota GitHub Completa automaticamente manifest di Puppet, dichiarazioni di risorse e definizioni di classi a partire da un breve commento o dal contesto del file. RevEsamina l'output per verificare la correttezza dei tipi di risorse, dei nomi degli attributi e delle dipendenze, poichรฉ il codice generato potrebbe fare riferimento a moduli o valori predefiniti obsoleti.

Riassumi questo post con: