Cum se utilizează modulele Puppet pentru automatizarea infrastructurii IT?



Un tutorial practic despre păpuși care vorbește despre scrierea unui modul de păpuși și utilizarea unui manifest pentru automatizarea și întreținerea infrastructurii IT a unei organizații.

Anterior, administratorii de sistem foloseau scripturile shell pentru a-și rula serverele, iar această metodă avea o scalabilitate zero. Este o sarcină descurajantă modificarea constantă a scripturilor pentru sute sau mii de servere în continuă schimbare și configurațiile lor de sistem.

În acest articol despre module de marionetă și manifeste să vedem cum am putea folosi module marionetă pentru automatizarea configurării serverului, instalarea programului și gestionarea sistemului.





Acest blog va acoperi următoarele subiecte:

Introducere în programarea păpușilor

Marionetă este unul dintre instrumentele DevOps utilizate în mod popular, care este utilizat pe scară largă pentru gestionarea configurației. Este folosit pentru a produce consistență în infrastructură. Puppet poate defini infrastructura ca cod, gestiona mai multe servere și poate aplica configurația sistemului, ajutând astfel la automatizarea procesului de gestionare a infrastructurii.



Marioneta arepropriul limbaj de configurare, Marionetă DSL . Ca și în alte programe DevOps, Puppet automatizează modificările, eliminând modificările manuale bazate pe script. Cu toate acestea, Puppet nu este pur și simplu un alt limbaj shell și nici nu este un limbaj de programare pur, cum ar fi PHP. În schimb, Puppet foloseștela abordare bazată pe model declarativ la automatizarea IT. Acest lucru permite Puppet să definească infrastructura ca cod și să impună configurarea sistemului cu programele.

Înainte de a începe demo-ul, să analizăm câteva aspecte esențiale ale programării marionetelor.

ce este big data și hadoop

Termeni cheie în programarea marionetelor

Manifeste

Se numește un program de păpuși manifesta și are un nume de fișier cu .pp extensie. Manifestul principal implicit al Puppet este /etc/puppet/manifests/site.pp . (Aceasta defineșteconfigurații globale ale sistemului, cum ar fi configurația LDAP, serverele DNS sau alte configurații care se aplică fiecărui nod).



Clase

În cadrul acestor manifeste sunt numite blocuri de cod clase alte module pot apela. Clasele configurează bucăți mari sau mijlocii de funcționalitate, cum ar fi toate pachetele, fișierele de configurare și serviciile necesare pentru a rula o aplicație. Clasele facilitează refolosirea codului Puppet și îmbunătățesc lizibilitatea.

Resurse

Codul marionetă este alcătuit în principal din declarații de resurse. A resursă descrie un element specific despre starea dorită a sistemului. De exemplu, poate include faptul că ar trebui să existe un anumit fișier sau să fie instalat un pachet.

Module de păpuși

Cu excepția principalelorsite.ppmanifesta,stochează manifesteleîn module .

Tot codul nostru Puppet este organizat în module care sunt elementele de bază ale marionetei pe care le putem reutiliza și partaja. Fiecare modul gestionează o sarcină specifică din infrastructură, cum ar fi instalarea și configurarea unui software.

Modulele conțin clase Puppet, tipuri definite, sarcini, planuri de sarcini, capacități, tipuri de resurse și pluginuri, de exemplu, tipuri personalizate sau fapte. Instalați module în Puppetmodul-cale. Puppet încarcă tot conținutul din fiecare modul din calea modulului, făcând acest cod disponibil pentru utilizare.

Module - Programare marionetă - EdurekaPuppetlabs are module predefinite pe care le putem folosi instantaneu descărcându-le PuppetForge . De asemenea, puteți crea un modul de păpuși personalizat pentru a se potrivi cerințelor dvs.

Flux de lucru program marionetă

Vom folosi limbajul declarativ al Puppet pentru a descrie starea dorită a sistemului în fișiere numite manifeste. Manifestele descriu modul în care ar trebui să vă configurați rețeaua și resursele sistemului de operare, cum ar fi fișiere, pachete și servicii.

Păpușa compilează manifestări în cataloage și aplică fiecare catalog nodului său corespunzător pentru a asigura configurația tnodul este corectîn toată infrastructura dvs.

Demonstrație: Automatizarea instalării Apache și MySQL

Acest articol despre modulele de păpuși este practic, care ar arăta două moduri de utilizare a unui modul de păpuși și, de asemenea, vă va învăța cum să automatiza instalarea unui server configurat cu aceste două module.

Pentru început, asigurați-vă că aveți pregătită o infrastructură Puppet care ar include un server de păpuși master și 2 agenți de păpuși.

  • Puppet Master: Ubuntu 18.04
  • Agent 1: Ubuntu 18.04
  • Agentul 2:CentOS7

Iată o schiță a ceea ce vom realiza în acest manual:


Deci, să începem cu practicile:

Crearea unui modul de la zero

În acest modul marionetă, ne vom ocupa de sarcini precum descărcarea pachetului Apache, configurarea fișierelor și configurarea gazdelor virtuale.

  • Din Puppet Master, navigați la directorul modulului Puppet și creați directorul Apache:
    cd / etc / puppet / modules sudo mkdir apache
  • Din interiorul directorului apache, creați subdirectoare: manifeste, șabloane, fișiere și exemple.
    cd apache sudo mkdir {manifeste, șabloane, fișiere, exemple}
  • Navigați la directorul manifestelor:
    cd se manifestă
  • De aici, vom separa modulul în clase pe baza obiectivelor secțiunii respective de cod.

init.pp -> pentru a descărca pachetul Apache

params.pp -> pentru a defini orice variabile și parametri

config.pp -> pentru a gestiona orice fișiere de configurare pentru serviciul Apache.

vhosts.pp -> pentru a defini gazdele virtuale.

Acest modul va folosi, de asemenea Hiera (un sistem încorporat de căutare a datelor de configurare valoare-cheie, utilizat pentru separarea datelor de codul Puppet) date, pentru a stoca variabile pentru fiecare nod.

Pasul 1: Descărcarea pachetului Apache

Creați clasa init.pp

Acum vom crea uninit.ppfișier din directorul manifesturi pentru a păstra pachetul apache.
Deoarece avem 2 sisteme de operare diferite (ubuntu și CentOS7) care folosesc nume de pachete diferite pentru Apache, va trebui să folosim o variabilă$ apachename.

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

clasă apache {pachet {'apache': nume => $ apachename, asigurați-vă => prezent,}}

pachet resursa permite gestionarea unui pachet. Aceasta este utilizată pentru a adăuga, a elimina sau pentru a vă asigura că este prezent un pachet.

În cele mai multe cazuri, Nume a resursei (apache, de mai sus) ar trebui să fie numele pachetului administrat. Datorită diferitelor convenții de numire,numim numele real al pachetuluipeste cu Nume referinţă. Asa de Nume , solicită variabila încă nedefinită$ apachename.

asigura referința asigură faptul că pachetul esteprezent.

Creați fișierul params.pp

params.ppfișierul va defini variabilele necesare. În timp ce am putea defini aceste variabile în cadrulinit.ppfișier, deoarece mai multe variabile vor trebui utilizate în afara tipului de resursă, folosind unparams.ppfișier permite definirea variabilelor îndacădeclarații și utilizate în mai multe clase.

Creeaza oparams.ppfișier și următorul cod.

/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 o distribuție acceptată. ')}}

În afara originalului init.ppclasă, fiecare nume de clasă trebuie să se desprindă deapache. Numim această clasă ca apache :: params . Numele după două puncte trebuie să împărtășească un nume cu fișierul. Undacădeclarația este utilizată pentru a defini parametrii, extragând din informațiile furnizate de Factor , Puppet are instalarea facter ca parte a instalării sale în sine. Aici, Facter va trage în jos familia sistemului de operare (osfamilie), pentru a discerne dacă estepalarie rosiesauBazat pe Debian.

Cu parametrii definiți în sfârșit, trebuie să apelăm la params.pp fișier și parametrii îninit.pp. Pentru a face acest lucru, trebuie să adăugăm parametrii după numele clasei, dar înainte de deschiderea parantezei({).

Asa cainit.pppe care le-am creat mai devreme ar trebui să arate cam așa:

clasa apache ($ apachename = $ :: apache :: params :: apachename,) moștenește :: apache :: params {pachetul {'apache': nume => $ apachename, asigura => prezent,}}

Șirul de valori $ :: apache :: params :: value îi spune lui Puppet să scoată valorile din apache module, params class, urmată de numele parametrului. Fragmentul mosteneste :: apache :: params permiteinit.pppentru a moșteni aceste valori.

Pasul 2: Gestionați fișierele de configurare

Fișierul de configurare Apache va fi diferit în funcție de faptul dacă lucrați la un sistem bazat pe Red Hat sau Debian.

Puteți găsi următoarele fișiere de dependență la sfârșitul acestei demonstrații:httpd.conf(Palarie rosie),apache2.conf(Debian).

  • Copiați conținutul httpd.conf șiapache2.confîn fișiere separate și salvați-le în fișiere directorla / etc / puppetlabs / code / environment / production / modules / apache / files .
  • Editați ambele fișiere în dezactivați ține în viață. Va trebui să adăugați linia KeepAlive Off înhttpd.conffişier. Dacă nu doriți să modificați această setare, ar trebui să adăugăm un comentariu în partea de sus a fiecăruiafişier:
    /etc/puppetlabs/code/environments/production/modules/apache/files/httpd.conf
#Acest fișier este gestionat de marionetă

Adăugați aceste fișiere lainit.ppfișier, așa că Puppet va ști locația acestor fișiere atât pe serverul principal, cât și pe nodurile agentului. Pentru a face acest lucru, folosim fişier resursă.

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

fișier {'configuration-file': cale => $ conffile, asigurați-vă => fișier, sursă => $ confsource,}

Deoarece avem fișierele de configurare în două locații diferite, acordăm resursei numele generic Fișier de configurare cu dosarul cale definit ca un parametru cucaleatribut.

asigura asigură că este un fișier.

sursă oferă locația de pe Puppet master a fișierelor create mai sus.

Deschideparams.ppfişier.

Definim $ conffile și $ confsourcevariabile în cadruldacăafirmație:

/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'} else {...

Trebuie să adăugăm parametrii la începutul programuluiapachedeclarație de clasă îninit.ppfișier, similar cu exemplul anterior.

Când fișierul de configurare se modifică, Apache trebuie să repornească. Pentru a automatiza acest lucru, putem folosi resursa de serviciuîn combinație cu notifica atribut, care va apela resursa pentru a rula ori de câte ori fișierul de configurare este modificat:

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

fișier {'configuration-file': cale => $ conffile, assure => file, source => $ confsource, notification => Service ['apache-service'],} service {'apache-service': name => $ apachename, hasrestart => true,}

serviciu resursa folosește parametrul deja creat care a definit numele Apache pe sistemele Red Hat și Debian.
hasrestart atributul este utilizat pentru a declanșa o repornire a serviciului definit.

Pasul 3: Creați fișierele gazdă virtuală

În funcție de distribuția sistemului dvs., fișierele gazdei virtuale vor fi gestionate diferit. Din acest motiv, vom încadra codul pentru gazdele virtuale într-undacă, similară cu cea utilizată înparams.ppclasă, dar care conține resurse reale de păpuși.

  • Din interiorulapache / manifeste /director, creați și deschideți unvhosts.ppfişier. Adăugați scheletuldacăafirmație:

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

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

Locația fișierului gazdă virtuală pe serverul nostru CentOS 7 este/etc/httpd/conf.d/vhost.conf . Trebuie să creați fișierul ca șablon pe Puppet master. Faceți același lucru pentru fișierul gazdelor virtuale Ubuntu, care se află la/etc/apache2/sites-available/example.com.conf, înlocuindexample.comcu FQDN al serverului.

converti de la dublu la int
  • Navigați la șabloane fișier în cadrul apache și apoi creați două fișiere pentru gazdele dvs. virtuale:

Pentru sistemele 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 combinat

Pentru sistemele 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 combinatSolicitați toate acordate

Folosim doar două variabile în aceste fișiere: adminemail și numele serverului . Le vom defini pe bază de nod cu nod, în cadrulsite.ppfişier.

merge sort c++
  • Reveniți lavhosts.ppfişier. Șabloanele create pot fi acum menționate în cod:

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

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': assure => file, content => template ('apache / vhosts-rh .conf.erb '),}} elsif $ :: osfamily ==' Debian '{file {' /etc/apache2/sites-available/$servername.conf ': assure => file, content => template (' apache /vhosts-deb.conf.erb '),}} else {fail (' Aceasta nu este o distribuție acceptată. ')}}

Ambele familii de distribuție apelează lafişierresurse și preluați titlul locației gazdei virtuale pe distribuția respectivă. Pentru Debian, aceasta înseamnă încă o dată referirea la$ servernamevaloare.conţinutatributul apelează șabloanele respective.

  • Ambele fișiere gazdă virtuale fac referire la două directoare. În mod implicit nu sunt pe sisteme. Le putem crea prin utilizarea fișieruluifişierresursă, fiecare în cadruldacăafirmație. Completvhosts.conffișierul ar trebui să semene cu:

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

class apache :: vhosts {if $ :: osfamily == 'RedHat' {file {'/etc/httpd/conf.d/vhost.conf': assure => file, content => template ('apache / vhosts-rh .conf.erb '),} fișier {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / log ',]: assure => director,}} elsif $ :: osfamily == 'Debian' {fișier {'/etc/apache2/sites-available/$servername.conf': asigura => fișier, conținut => șablon ('apache / vhosts-deb. conf.erb '),} fișier {[' / var / www / $ servername ',' / var / www / $ servername / public_html ',' / var / www / $ servername / logs ',]: assure => director ,}} else {fail ('Aceasta nu este o distribuție acceptată.')}}

Pasul 4: Testați modulul

  • Navigați laapache / manifeste /director, rulați fișierul analizor marionetă pe toate fișierele pentru a vă asigura că codificarea Puppet este fără erori:

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

Ar trebui să revină gol, fără probleme.

  • Navigați la exemple director în cadrulapachemodul. Creaza uninit.ppfișier și includeți clasele create. Înlocuiți valorile pentru$ servernameși$ adminemailcu ale tale:

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

serveremail = 'webmaster@example.com' $ servername = 'păpușă.example.com' include apache include apache :: vhosts
  • Testați modulul rulând se aplică marionetă cu –Nu etichetă:
    sudo / opt / puppetlabs / bin / puppet apply --noop init.pp

Nu ar trebui să returneze erori și să arate că va declanșa reîmprospătarea de la evenimente. Pentru a instala și configura apache pe Puppet master, rulați din nou fără–Nu, dacă se dorește.

  • Navigați înapoi la directorul principal Puppet și apoi lamanifestădosar (nucel prezent în modulul Apache).

cd / etc / puppetlabs / code / Environments / Production / Manifests

Creeaza osite.ppfişier,și include modulul Apache pentru fiecare nod agent. De asemenea, introduceți variabilele pentruadminemail și numele serveruluiparametrii. Tasite.ppar trebui să semene cu următoarele:

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

nodul „marionetă-agent-ubuntu.example.com” {$ adminemail = 'webmaster@example.com' $ servername = 'marionetă.exemplu.com' include apache include apache :: vhosts} nod 'marionetă-agent-centos.example .com '{$ adminemail =' webmaster@example.com '$ servername =' păpușă.example.com 'include apache include apache :: vhosts}

În mod implicit, serviciul agent Puppet de pe nodurile gestionate va verifica automat cu masterul o dată la 30 de minute și va aplica orice configurații noi de la master. De asemenea, puteți invoca manual procesul agent Puppet între rulările automate ale agentului. Pentru a rula manual noul modul pe nodurile agentului dvs., conectați-vă la noduri și rulați:

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

Acum, că am învățat cum să creăm un modul de la zero, să învățăm cum să folosim un modul preexistent din forja păpușilor de păpuși.

Folosiți un modul de la PuppetForge

Marionetă Forge are deja multe module pentru a rula serverul. Le putem configura la fel de mult ca un modul pe care l-ați creat și putem economisi timp, deoarece nu trebuie să creăm modulul de la zero.

Asigurați-vă că vă aflați în / etc / puppetlabs / code / environment / production / modules director și instalați fișierul Modulul MySQL al Puppet Forge de PuppetLabs. Aceasta va instala, de asemenea, orice module prealabile.

cd / etc / puppetlabs / cod / medii / producție / module

sudo / opt / puppetlabs / bin / puppet module install puppetlabs-mysql

Utilizați Hiera pentru a crea baze de date

Înainte de a crea fișierele de configurare pentru modulul MySQL, considerați că este posibil să nu doriți să utilizați aceleași valori în toate nodurile agentului. Pentru a furniza Puppet cu datele corecte pe nod, folosim Hiera. Veți utiliza o parolă rădăcină diferită pe nod, creând astfel diferite baze de date MySQL.

  • Navigheaza catre/ etc / marionetăși creați fișierul de configurare Hierahiera.yamlîn principalmarionetădirector. Veți utiliza valorile implicite ale Hiera:

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

--- versiune: 5 ierarhie: - nume: Calea obișnuită: common.yaml implicit: data_hash: yaml_data datadir: data
  • Creați fișierulcomun.yaml. Se va defini implicit rădăcină parola pentru MySQL:

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

mysql :: server :: root_password: 'parolă'

Noi folosimcomun.yamlfişiercând o variabilă nu este definită în altă parte. Aceasta înseamnă că toate serverele vor partaja aceeași parolă de root MySQL. Aceste parole pot fi, de asemenea, hash pentru a spori securitatea.

  • Pentru a utiliza valorile implicite ale modulului MySQL, puteți adăuga un includeți „:: mysql :: server” linie lasite.ppfişier. Cu toate acestea, în acest exemplu, veți înlocui unele dintre valorile implicite ale modulului pentru a crea o bază de date pentru fiecare dintre nodurile dvs.

Editați fișierulsite.ppfișier cu următoarele valori:

nodul '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 =>' utilizatorul meu ', parola =>' mypass ', dbname =>' mydb ', host => $ :: fqdn, grant => [' SELECT ',' UPDATE '], tag = > $ domeniu,}} nod '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', ' ACTUALIZARE '], tag => $ domeniu,}}

Automatizarea instalării modulelor Puppet de la Puppet Master la Puppet Agent

  • Puteți rula aceste actualizări manual pe fiecare nod prin SSHing în fiecare nod și lansând următoarea comandă:

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

  • În caz contrar, serviciul agent Puppet de pe nodurile gestionate va verifica automat cu masterul o dată la 30 de minute și va aplica orice configurații noi de la master.

Catalog aplicat cu succes pe agentul Ubuntu

Catalog aplicat cu succes pe agent CentOS

Astfel, întreaga instalare devine automatizat pe nodurile agentului doar prin aplicarea catalogului.Fișierele de cod și dependențele utilizate pentru această demonstrație pot fi găsite Aici .

Sper că această demonstrație v-a ajutat să vă faceți o idee clară despre modulele și manifestele marionetă și despre utilizarea lor pentru automatizarea infrastructurii IT.În acest caz, munca dvs. devine atât de ușoară, trebuie doar să specificați configurațiile din Puppet Master și agenții Puppet vor evalua automat manifestul principal și vor aplica modulul care specifică configurarea Apache și MySQL. Dacă sunteți blocat cu orice întrebări, vă rugăm să nu ezitați să le postați pe .

Dacă ai găsit asta Tutorial marionetă relevant, verificați de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Cursul Edureka DevOps Certification Training ajută cursanții să câștige expertiză în diferite procese și instrumente DevOps, cum ar fi Puppet, Jenkins, Nagios și GIT pentru automatizarea mai multor pași în SDLC.