Come utilizzare i moduli Puppet per l'automazione dell'infrastruttura IT?



Un tutorial pratico sui pupazzi che parla della scrittura di un modulo del pupazzo e dell'utilizzo di un manifest per automatizzare e mantenere l'infrastruttura IT di un'organizzazione.

In precedenza, gli amministratori di sistema utilizzavano gli script della shell per eseguire i propri server e questo metodo non aveva scalabilità. È un compito arduo modificare costantemente gli script per centinaia o migliaia di server in continua evoluzione e le loro configurazioni di sistema.

In questo articolo su moduli e manifesti delle marionette vediamo come potremmo utilizzare i moduli pupazzo per automatizzare la configurazione del server, l'installazione del programma e la gestione del sistema.





Questo blog tratterà i seguenti argomenti:

Introduzione alla programmazione dei pupazzi

Fantoccio è uno degli strumenti DevOps comunemente utilizzati che è ampiamente utilizzato per la gestione della configurazione. È usato per provocare consistenza nell'infrastruttura. Puppet può definire l'infrastruttura come codice, gestire più server e applicare la configurazione del sistema, aiutando così ad automatizzare il processo di gestione dell'infrastruttura.



Puppet hail proprio linguaggio di configurazione, Puppet DSL . Come con altri programmi DevOps, Puppet automatizza le modifiche, eliminando le modifiche manuali guidate da script. Tuttavia, Puppet non è semplicemente un altro linguaggio shell, né è un puro linguaggio di programmazione, come PHP. Invece, Puppet usaper approccio basato su modelli dichiarativi all'automazione IT. Ciò consente a Puppet di definire l'infrastruttura come codice e di applicare la configurazione del sistema con i programmi.

Prima di procedere con la demo, diamo un'occhiata ad alcuni aspetti fondamentali della programmazione dei pupazzi.

aziende che utilizzano il linguaggio di programmazione r

Termini chiave nella programmazione dei pupazzi

Manifesta

Viene chiamato un programma fantoccio manifesto e ha un nome file con .pp estensione. Il manifest principale predefinito di Puppet è /etc/puppet/manifests/site.pp . (Questo definisceconfigurazioni di sistema globali, come configurazione LDAP, server DNS o altre configurazioni che si applicano a ogni nodo).



Classi

All'interno di questi manifesti sono chiamati blocchi di codice classi altri moduli possono chiamare. Le classi configurano blocchi di funzionalità di grandi o medie dimensioni, come tutti i pacchetti, file di configurazione e servizi necessari per eseguire un'applicazione. Le classi semplificano il riutilizzo del codice Puppet e migliorano la leggibilità.

Risorse

Il codice Puppet è composto principalmente da dichiarazioni di risorse. UN risorsa descrive un elemento specifico sullo stato desiderato del sistema. Ad esempio, può includere la presenza di un file specifico o l'installazione di un pacchetto.

Moduli Puppet

Fatta eccezione per il principalesite.ppmanifesto,memorizza i manifestinel moduli .

Tutto il nostro codice Puppet è organizzato in moduli che sono gli elementi costitutivi di base di Puppet che possiamo riutilizzare e condividere. Ogni modulo gestisce un'attività specifica nell'infrastruttura, come l'installazione e la configurazione di un software.

I moduli contengono classi Puppet, tipi definiti, attività, piani di attività, capacità, tipi di risorse e plug-in, ad esempio tipi o fatti personalizzati. Installa i moduli in Puppetpercorso-modulo. Puppet carica tutto il contenuto da ogni modulo nel percorso del modulo, rendendo questo codice disponibile per l'uso.

Moduli - Puppet Programming - EdurekaPuppetlabs ha moduli predefiniti che possiamo utilizzare immediatamente scaricandoli da PuppetForge . Puoi anche creare un modulo pupazzo personalizzato in base alle tue esigenze.

Flusso di lavoro del programma Puppet

Useremo il linguaggio dichiarativo di Puppet per descrivere lo stato desiderato del sistema in file chiamati manifesti. I manifesti descrivono come configurare la rete e le risorse del sistema operativo, come file, pacchetti e servizi.

Puppet compila si manifesta in cataloghi e applica ogni catalogo al suo nodo corrispondente per garantire che la configurazione di til nodo è correttoin tutta la tua infrastruttura.

Dimostrazione: Automatizzare l'installazione di Apache e MySQL

Questo articolo sui moduli pupazzo è pratico che mostra due modi di utilizzare un modulo pupazzo e ti insegna anche come farlo automatizzare l'installazione di un server configurato con questi due moduli.

Per cominciare, assicurati di avere pronta un'infrastruttura Puppet che includa un server Puppet Master e 2 agenti Puppet.

  • Puppet Master: Ubuntu 18.04
  • Agente 1: Ubuntu 18.04
  • Agente 2:CentOS7

Ecco uno schema di ciò che otterremo in questa pratica:


Quindi iniziamo con la pratica:

Creare un modulo da zero

In questo modulo pupazzo, ci occuperemo di attività come il download del pacchetto Apache, la configurazione dei file e l'impostazione degli host virtuali.

  • Da Puppet Master, vai alla directory dei moduli di Puppet e crea la directory di Apache:
    cd / etc / puppet / modules sudo mkdir apache
  • Dall'interno della directory apache, creare sottodirectory: manifesti, modelli, file ed esempi.
    cd apache sudo mkdir {manifesti, modelli, file, esempi}
  • Vai alla directory dei manifesti:
    cd si manifesta
  • Da qui, separeremo il modulo in classi in base agli obiettivi di quella sezione di codice.

init.pp -> per scaricare il pacchetto Apache

params.pp -> per definire eventuali variabili e parametri

config.pp -> per gestire qualsiasi file di configurazione per il servizio Apache.

vhosts.pp -> per definire gli host virtuali.

Questo modulo utilizzerà anche Hiera (un sistema di ricerca dei dati di configurazione valore-chiave integrato, utilizzato per separare i dati dai dati del codice Puppet, per memorizzare le variabili per ogni nodo.

Passaggio 1: download del pacchetto Apache

Crea la classe init.pp

Ora creeremo un fileinit.ppfile nella directory manifesti per contenere il pacchetto apache.
Poiché abbiamo 2 diversi sistemi operativi (ubuntu e CentOS7) che utilizzano nomi di pacchetti diversi per Apache, dovremo utilizzare una variabile$ apachename.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

class apache {pacchetto {'apache': name => $ apachename, assicurare => presente,}}

pacchetto risorsa consente la gestione di un pacchetto. Viene utilizzato per aggiungere, rimuovere o assicurarsi che un pacchetto sia presente.

Nella maggior parte dei casi, il nome della risorsa (apache, sopra) dovrebbe essere il nome del pacchetto gestito. A causa delle diverse convenzioni di denominazione,chiamiamo il nome effettivo del pacchettoavanti con il nome riferimento. Così nome , richiede la variabile non ancora definita$ apachename.

garantire il riferimento garantisce che il pacchetto siapresente.

mysql_fetch_array php

Crea il file params.pp

Ilparams.ppfile definirà le variabili necessarie. Sebbene potremmo definire queste variabili all'interno diinit.ppfile, poiché più variabili dovranno essere utilizzate al di fuori del tipo di risorsa stesso, utilizzando un fileparams.ppfile consente di definire le variabili inSedichiarazioni e utilizzato in più classi.

Creare unparams.ppfile e il codice seguente.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

class apache :: params {if $ :: osfamily == 'RedHat' {$ apachename = 'httpd'} elsif $ :: osfamily == 'Debian' {$ apachename = 'apache2'} else {fail ('this is not una distribuzione supportata. ')}}

Al di fuori dell'originale init.ppclasse, ogni nome di classe deve diramarsiapache. Chiamiamo questa classe come apache :: params . Il nome dopo i doppi due punti dovrebbe condividere un nome con il file. UnSeviene utilizzata per definire i parametri, attingendo alle informazioni fornite da Fattore , Puppet ha un'installazione facter come parte della sua installazione stessa. Qui, Facter tirerà giù la famiglia del sistema operativo (osfamily), per discernere se lo ècappello rossooBasato su Debian.

Con i parametri finalmente definiti, dobbiamo chiamare il file params.pp file e i parametri ininit.pp. Per fare ciò, dobbiamo aggiungere i parametri dopo il nome della classe, ma prima della parentesi graffa aperta({).

Così ilinit.ppche abbiamo creato in precedenza dovrebbe assomigliare a questo:

class apache ($ apachename = $ :: apache :: params :: apachename,) eredita :: apache :: params {pacchetto {'apache': name => $ apachename, assicurare => present,}}

La stringa del valore $ :: apache :: params :: value dice a Puppet di estrarre i valori dal file apache moduli, params class, seguito dal nome del parametro. Il frammento inherits :: apache :: params consenteinit.ppereditare questi valori.

Passaggio 2: gestire i file di configurazione

Il file di configurazione di Apache sarà diverso a seconda che si lavori su un sistema basato su Red Hat o Debian.

È possibile trovare i seguenti file di dipendenza alla fine di questa demo:httpd.conf(Cappello rosso),apache2.conf(Debian).

  • Copia il contenuto di httpd.conf eapache2.confin file separati e salvarli nel file File directorya / etc / puppetlabs / code / ambienti / production / modules / apache / files .
  • Modifica entrambi i file in disattivare keepalive. Dovrai aggiungere la linea KeepAlive Off nelhttpd.conffile. Se non desideri modificare questa impostazione, dobbiamo aggiungere un commento all'inizio di ciascunafile:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#Questo file è gestito da puppet

Aggiungi questi file al fileinit.ppfile, quindi Puppet conoscerà la posizione di questi file sia sul server master che sui nodi dell'agente. Per fare questo, usiamo il file risorsa.

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

file {'file di configurazione': percorso => ​​$ conffile, garantire => file, sorgente => $ confsource,}

Poiché abbiamo i file di configurazione in due posizioni diverse, diamo alla risorsa il nome generico file di configurazione con il file sentiero definito come parametro con l'estensionesentieroattributo.

garantire assicura che si tratti di un file.

fonte fornisce la posizione sul Puppet master dei file creati sopra.

Apri ilparams.ppfile.

Definiamo il $ conffile e $ confsourcevariabili all'interno diSedichiarazione:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/params.pp

if $ :: osfamily == 'RedHat' {... $ conffile = '/etc/httpd/conf/httpd.conf' $ confsource = 'puppet: ///modules/apache/httpd.conf'} elsif $: : osfamily == 'Debian' {... $ conffile = '/etc/apache2/apache2.conf' $ confsource = 'puppet: ///modules/apache/apache2.conf'} altro {...

Dobbiamo aggiungere i parametri all'inizio del fileapachedichiarazione di classe ininit.ppfile, simile all'esempio precedente.

Quando il file di configurazione cambia, Apache deve essere riavviato. Per automatizzare questo, possiamo usare la risorsa del servizioin combinazione con il notificare attributo, che chiamerà la risorsa da eseguire ogni volta che il file di configurazione viene modificato:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/init.pp

file {'file di configurazione': path => $ conffile, assicurare => file, source => $ confsource, notify => Service ['apache-service'],} service {'apache-service': name => $ apachename, hasrestart => true,}

servizio resource utilizza il parametro già creato che ha definito il nome Apache sui sistemi Red Hat e Debian.
hasrestart l'attributo viene utilizzato per attivare un riavvio del servizio definito.

Passaggio 3: creare i file dell'host virtuale

A seconda della distribuzione del sistema, i file dell'host virtuale verranno gestiti in modo diverso. Per questo motivo, racchiuderemo il codice per gli host virtuali in un fileSedichiarazione, simile a quella utilizzata inparams.ppclasse ma contenente le risorse effettive di Puppet.

  • Dall'interno diapache / manifesti /directory, creare e aprire un filevhosts.ppfile. Aggiungi lo scheletro del fileSedichiarazione:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {} elsif $ :: osfamily == 'Debian' {} else {}}

La posizione del file host virtuale sul nostro server CentOS 7 è/etc/httpd/conf.d/vhost.conf . Devi creare il file come modello sul Puppet master. Fai lo stesso per il file degli host virtuali di Ubuntu, che si trova in/etc/apache2/sites-available/example.com.conf, sostituendoexample.comcon l'FQDN del server.

  • Vai al file modelli file all'interno del apache modulo e quindi crea due file per i tuoi host virtuali:

Per i sistemi Red Hat:
/etc/puppetlabs/code/environments/production/modules/apache/templates/vhosts-rh.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www // public_html / ErrorLog /var/www//logs/error.log CustomLog /var/www//logs/access.log combinato

Per i sistemi Debian:
/etc/puppet/modules/apache/templates/vhosts-deb.conf.erb

ServerAdmin ServerName ServerAlias ​​www. DocumentRoot / var / www / html // public_html / ErrorLog /var/www/html//logs/error.log CustomLog /var/www/html//logs/access.log combinatoRichiedi tutto concesso

Usiamo solo due variabili in questi file: adminemail e nome del server . Li definiremo nodo per nodo, all'interno disite.ppfile.

  • Torna alvhosts.ppfile. I modelli creati possono ora essere referenziati nel codice:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': garantire => file, content => template ('apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily ==' Debian '{file {' /etc/apache2/sites-available/$servername.conf ': sure => file, content => template (' apache /vhosts-deb.conf.erb '),}} else {fail (' Questa non è una distribuzione supportata. ')}}

Entrambe le famiglie di distribuzione chiamano alfilerisorsa e assumere il titolo della posizione dell'host virtuale nella rispettiva distribuzione. Per Debian, questo significa ancora una volta fare riferimento a$ servernamevalore. Ilsoddisfareattributo chiama i rispettivi modelli.

  • Entrambi i file dell'host virtuale fanno riferimento a due directory. Non sono sui sistemi per impostazione predefinita. Possiamo crearli tramite l'uso difilerisorsa, ciascuna all'interno delSedichiarazione. Il completovhosts.confil file dovrebbe assomigliare a:

/etc/puppetlabs/code/environments/production/modules/apache/manifests/vhosts.pp

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': garantire => file, content => template ('apache / vhosts-rh .conf.erb '),} file {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / log ',]: garantire => directory,}} elsif $ :: osfamily == 'Debian' {file {'/etc/apache2/sites-available/$servername.conf': garantire => file, content => template ('apache / vhosts-deb. conf.erb '),} file {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / logs ',]: assicurarsi => directory ,}} else {fail ('Questa non è una distribuzione supportata.')}}

Passaggio 4: testare il modulo

  • Vai al fileapache / manifesti /directory, esegui il file analizzatore di marionette su tutti i file per garantire che la codifica di Puppet sia senza errori:

sudo / opt / puppetlabs / bin / parser puppet convalida init.pp params.pp vhosts.pp

Dovrebbe tornare vuoto, senza problemi.

  • Vai al file esempi directory all'interno diapachemodulo. Creare uninit.ppfile e includere le classi create. Sostituisci i valori per$ servernamee$ adminemailcon il tuo:

/etc/puppetlabs/code/environments/production/modules/apache/examples/init.pp

serveremail = 'webmaster@example.com' $ servername = 'puppet.example.com' include apache include apache :: vhosts
  • Testare il modulo eseguendo applicare il burattino con il –Noop etichetta:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

Non dovrebbe restituire errori e restituire un output che attiverà gli aggiornamenti dagli eventi. Per installare e configurare apache su Puppet master, esegui di nuovo senza–Noop, se lo si desidera.

  • Torna alla directory principale di Puppet e poi al filemanifestacartella (nonquello presente nel modulo Apache).

cd / etc / puppetlabs / code / ambienti / production / manifests

Creare unsite.ppfile,e includere il modulo Apache per ogni nodo dell'agente. Immettere anche le variabili peradminemail e nome del serverparametri. Il tuosite.ppdovrebbe assomigliare a quanto segue:

/etc/puppetlabs/code/environments/production/manifests/site.pp

node 'puppet-agent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'puppet.example.com' include apache include apache :: vhosts} node 'puppet-agent-centos.example .com '{$ adminemail =' webmaster@example.com '$ servername =' puppet.example.com 'include apache include apache :: vhosts}

Per impostazione predefinita, il servizio dell'agente Puppet sui nodi gestiti verificherà automaticamente con il master una volta ogni 30 minuti e applicherà eventuali nuove configurazioni dal master. È inoltre possibile richiamare manualmente il processo dell'agente Puppet tra le esecuzioni automatiche dell'agente. Per eseguire manualmente il nuovo modulo sui nodi dell'agente, accedi ai nodi ed esegui:

sudo / opt / puppetlabs / bin / puppet agent -t

Ora che abbiamo imparato come creare un modulo da zero, impariamo come utilizzare un modulo preesistente dalla fucina di marionette di laboratori di marionette.

Usa un modulo di PuppetForge

Puppet Forge ha già molti moduli per l'esecuzione del server. Possiamo configurarli in modo estensivo come un modulo che hai creato e possiamo risparmiare tempo poiché non è necessario creare il modulo da zero.

Assicurati di essere in / etc / puppetlabs / code / environment / production / modules directory e installa il file Modulo MySQL di Puppet Forge di PuppetLabs. Questo installerà anche eventuali moduli prerequisiti.

cd / etc / puppetlabs / codice / ambienti / produzione / moduli

sudo / opt / puppetlabs / bin / modulo puppet installa puppetlabs-mysql

Usa Hiera per creare database

Prima di creare i file di configurazione per il modulo MySQL, tieni presente che potresti non voler utilizzare gli stessi valori su tutti i nodi dell'agente. Per fornire a Puppet i dati corretti per nodo, utilizziamo Hiera. Utilizzerai una password di root diversa per nodo, creando così diversi database MySQL.

  • Navigare verso/ etc / puppete crea il file di configurazione di Hierahiera.yamlnel principalefantocciodirectory. Utilizzerai i valori predefiniti di Hiera:

/etc/puppetlabs/code/environments/production/hiera.yaml

--- versione: 5 gerarchia: - nome: percorso comune: common.yaml valori predefiniti: data_hash: yaml_data datadir: dati
  • Crea il filecommon.yaml. Definirà il valore predefinito radice password per MySQL:

/etc/puppetlabs/code/environments/production/common.yaml

mysql :: server :: root_password: 'password'

Noi usiamo ilcommon.yamlfilequando una variabile non è definita altrove. Ciò significa che tutti i server condivideranno la stessa password di root MySQL. Queste password possono anche essere sottoposte ad hashing per aumentare la sicurezza.

  • Per utilizzare le impostazioni predefinite del modulo MySQL puoi aggiungere un file includi ':: mysql :: server' linea alsite.ppfile. Tuttavia, in questo esempio, sovrascriverete alcune delle impostazioni predefinite del modulo per creare un database per ciascuno dei vostri nodi.

Modifica il filesite.ppfile con i seguenti valori:

funzione di ordinamento c ++
nodo 'Puppetagent-ubuntu.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb_ $ {fqdn} ': user =>' myuser ', password =>' mypass ', dbname =>' mydb ', host => $ :: fqdn, grant => [' SELECT ',' UPDATE '], tag = > $ domain,}} nodo 'Puppetagent-centos.example.com' {$ adminemail = 'webmaster@example.com' $ servername = 'hostname.example.com' include apache include apache :: vhosts include mysql :: server mysql :: db {'mydb _ $ {fqdn}': user => 'myuser', password => 'mypass', dbname => 'mydb', host => $ :: fqdn, grant => ['SELECT', ' AGGIORNAMENTO '], tag => $ domain,}}

Automatizzazione dell'installazione dei moduli Puppet dal burattinaio all'agente burattinaio

  • È possibile eseguire questi aggiornamenti manualmente su ogni nodo tramite SSH in ogni nodo e immettendo il seguente comando:

sudo / opt / puppetlabs / bin / puppet agent -t

  • In caso contrario, il servizio dell'agente Puppet sui nodi gestiti verificherà automaticamente con il master una volta ogni 30 minuti e applicherà eventuali nuove configurazioni dal master.

Catalogo applicato con successo sull'agente Ubuntu

Catalogo applicato correttamente sull'agente CentOS

Pertanto, l'intera installazione ottiene automatizzato sui nodi dell'agente semplicemente applicando il catalogo.È possibile trovare i file di codice e le dipendenze utilizzati per questa demo Qui .

Spero che questa demo ti abbia aiutato a farti un'idea chiara dei moduli e dei manifesti dei pupazzi e del loro utilizzo per l'automazione dell'infrastruttura IT.In questo caso, il tuo lavoro diventa così facile, basta specificare le configurazioni in Puppet Master e gli agenti Puppet valuteranno automaticamente il manifest principale e applicheranno il modulo che specifica le impostazioni di Apache e MySQL. Se sei bloccato con qualsiasi domanda, sentiti libero di pubblicarla su .

Se hai trovato questo Tutorial marionette pertinente, controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione sulla certificazione Edureka DevOps aiuta gli studenti ad acquisire esperienza in vari processi e strumenti DevOps come Puppet, Jenkins, Nagios e GIT per l'automazione di più passaggi in SDLC.