TSM - Automatizare folosind puppet

Claudiu Demian - Systems Administrator

Automatizarea reprezintă o componentă importantă în IT, atât în dezvoltarea software cât și în administrarea sistemelor și a infrastructurii. În cazul mediilor mari și dinamice, implementarea unei forme de automatizare reprezintă o nevoie esențială pentru a asigura un proces optim de management al resurselor.  

Puppet este un sistem de management al configurațiilor care permite administratorilor de sistem definirea stării infrastructurii IT. Orice modificare care trebuie efectuată se traduce într-o modificare în configurația puppet pentru respectiva resursa (fișier/pachet/nod/grup de noduri etc.), care este aplicată în mod automat pe toate serverele sau nodurile vizate de respectiva schimbare.  

Descrierea acestei stări se realizează folosind limbajul puppet, care este un limbaj declarativ. Configurația generală se găsește în fișierul /etc/puppet/manifests/site.pp. Aici sunt referite modulele, clasele și resursele definite în /etc/puppet/modules.

Puppet poate funcționa atât într-o arhitectură de tip client-server cît și stand-alone. În primul caz, serverul puppet poartă numele de puppetmaster. Pe mașina puppetmaster este definită configurația infrastructurii, care este mai apoi preluată de către clienți la intervale regulate de timp (modificabile de către administrator).

În continuare, oferim un exemplu elocvent pentru modul de utilizare a limbajului:

/etc/puppet/modules/lighttpd/manifests/init.pp:
class lighttpd {
package{'lighttpd':
  ensure => installed,
}
file{'/etc/lighttpd/lighttpd.conf':
  content => template('lighttpd/lighttpd.conf.erb'),
  notify  => Service['lighttpd'];
}

service{'lighttpd':
  ensure => running,
  enable => true,
}
}

Aceasta clasă prezintă o instalare a serverului web lighttpd, descriind fiecare componentă necesară. Astfel, putem identifica primele tipuri de resurse de care dispune puppet și care sunt probabil și cele mai folosite.

Un modul reprezintă un set de clase, definiții, template-uri și fișiere care împreună,îndeplinesc un singur scop. De aici rezultă și prima recomandare în scrierea unui modul: trebuie să îndeplinească o singură funcționalitate. Exemplu: un server LAMP ar putea fi gestionat cu un singur modul puppet care se ocupă de instalarea Apache-ului, a serverului MySQL, a PHP-ului și a oricăror alte servicii conexe din Linux (autentificare, NTP, etc.). Problema care apare este că acest modul riscă să ajungă prea mare și greu de gestionat. În plus, își pierde din portabilitate. O soluție mai elegantă este despărțirea configurațiilor în patru module separate, reducându-se astfel complexitatea fiecăruia.

Clasa reprezintă un bloc de cod care poate fi instanțiat. Fiecare modul are definită în fișierul manifests/init.pp clasa principală a modulului. Instanțierea unei clase la nivelul unui nod, astfel încât să se aplice schimbările sale se realizează folosind directiva include.

_/etc/puppet/manifests/site.pp_:
node /web\d+/ {
   include lighttpd
}

Clasele suportă moșteniri și pot fi instanțiate de mai multe ori în configurația generală puppet, care se găsește în fișierul site.pp. De asemenea, clasele pot fi parametrizate.

În cadrul unei clase definim starea dorită a sistemului folosind resurse de tipuri predefinite sau definite de administrator. În exemplul anterior, putem identifica următoarele resurse: pachetul lighttpd, fișierul /etc/lighttpd/lighttpd.conf și serviciul lighttpd. Fiecare resursă are un tip (package, file și respectiv service), un nume și unul sau mai multe atribute (ensure, content, notify, etc.). Puppet dispune de un număr satisfăcător de tipuri predefinite pentru resurse, foarte bine documentate în documentația lor oficială.

O altă funcționalitate utilă a puppet-ului este aceea de template-ing. Folosind limbajul ERB (Embedded Ruby), puppet oferă posibilitatea de a genera fișiere în funcție de parametri oferiți de administrator la instanțierea clasei sau de starea sistemului, folosind fact-uri. Împreună cu puppet-ul, pe sistem se instalează și un utilitar numit facter. Acesta aduna informații despre sistem și le expune ca fact-uri (exemplu: _ipaddress, fqdn, operatingsystem etc.). Aceasta funcționalitate poate fi extinsă cu _fact-_uri definite de administrator care, la rândul lor, pot fi utilizate în template-uri.

Datorită faptului că modulele sunt de sine stătătoare și refolosibile, puppet oferă serviciul PuppetForge prin care utilizatorii pot oferi gratuit module realizate de ei și pot descăra modulele altor utilizatori.

Pe lângă funcționalitatea de bază, aceea de a descrie starea sistemului, puppet poate fi extins pentru a aduna statistici despre infrastructură. Aceasta se realizează folosind serviciul puppetdb. Acesta are în spate o bază de date în care se agregă fact-urile tuturor sistemelor din infrastructură. Aceste informații pot fi utilizate ulterior în cadrul claselor pentru a genera dinamic resurse.

Un exemplu de utilizare al _puppetdb-_ului îl reprezintă un modul de gestionare a unei instanțe de Nagios. Acesta, folosind informații despre sisteme din puppetdb (hostname, ip, din care hostgroup-uri face parte), generează automat câte un fișier de configurare pentru fiecare nou host introdus în infrastructură. Administratorului îi rămâne doar sarcina de a defini comenzi, check-uri și hostgroup-uri.

O altă posibilitate de a extinde puppet-ul este folosind puppet-dashboard. Acest serviciu oferă o interfață web prin care ni se oferă mai multe informații și statistici despre infrastructură. În primul rând, fiecare client trimite către serverul pe care rulează puppet-dashboard un raport despre ultima rulare a clientului: dacă a rulat cu succes, dacă s-a modificat ceva, ce a crăpat etc. Putem vizualiza aceste rapoarte în aplicație, precum și statistici generate din aceste rapoarte.

De asemenea, puppet-dashboard ne oferă și un serviciu numit Inventory Service prin care să putem interoga starea sistemului, tot în funcție de fact-uri. Dacă folosind puppetdb putem folosi aceste informații în interiorul claselor, folosind Inventory Service avem acces la ele din exterior. Folosind API-ul lor, putem construi unelte/aplicații care să folosească aceste informații.

Acest articol s-a dorit a fi o introducere în puppet pentru cei care încă nu l-au introdus în mediul lor. Flexibilitatea și potențialul de a ușura munca administratoriloor pe care puppet le oferă pot reprezenta argumente convingătoare în favoarea adoptării acestuia. Nu susținem că puppet reprezintă soluția tuturor problemelor sau că este cel mai bun sistem de gestiune a configurațiior- mai sunt chef, cfengine sau alte sisteme comerciale- dar susținem ideea că orice administrator de sistem ar trebui să folosească un astfel de sistem în infrastructura pe care o gestionează.