Puppet - Orkestracija servisa

Izvor: SIS Wiki
Skoči na: orijentacija, traži

Sistem administratori i računalni operateri često obavljaju iste zadaće: konfiguriranje host računala, upravljanje korisničkim računima, upravljanje aplikacijama i daemonsima (na UNIX sustavima to su pozadinske aplikacije, procesi koji nisu u direktnom kontaktu s korisnikom računala). Ove se zadaće često ponavljaju više puta u životnom ciklusu računala kojeg administriraju.

Uobičajen odgovor na ove ponavljajuće zadaće je pokušaj njihove automatizacije skriptama i raznim alatima za rad na daljinu što dovodi do razvoja tzv. custom-built skripti i aplikacija.

Puppet je reakcija open source zajednice na sve nedostatke trenutačno dostupnih alata za sistem administratore, operatere i developere. Sam Puppet osmišljen je tako da im olakša živote pružajući jednostavnu, laganu i jeftinu infrastrukturu za održavanje računala. Puppet je open source framework za orkestraciju servisa o čemu će bit riječ uskoro.

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Sadržaj


Orkestracija

Prema definiciji, orkestracija je proces automatiziranog uređivanja, koordiniranja i upravljanja kompleksnih informacijskih sustava i servisa.

Praktični primjer orkestracije bi bio (ujedno obrađen u našem projektnom zadatku) instalacija WordPressa na tek "podignutom" računalnom sustavu. WordPress zahtjeva dostupan SUBP i korisnički račun za korištenje BP, a tu je i sama instalacija WP-a. Orkestracija u navedenom primjeru znači pokretanje skripte za instalaciju WP-a koja će automatizmom instalirati WP preduvjete (npr. MySQL) i podesiti okolinu (generirati bazu podataka, korisnički račun za rad s BP i dr.).

Proces nastajanja pojma orkestracije tekao je poprilično prirodno. IT stručnjaci i system administratori koji su bili zaduženi za upravljanje informacijskim sustavima i servisima susretali su se s nizom ponavljajućih (repetitivnih) radnji kao što je npr. dodavanje novih članova, izmjena inačica sustava i sl. Te repetitivne radnje bile su neophodne, a zahtijevale su dosta vremena tj. dosta ljudskog rada. Potrebu za smanjivanje repetitivnih zadataka iskoristile su veće kompanije plasirajući programska rješenja koja su za zadani predložak automatizirale određene zadatke. Nedostatak tih programskih rješenja se nalazio u njihovoj cijeni i neprilagodljivosti potrebama specifičnih informacijskih sustava. Njihovo prilagođavanje zahtijevalo je naručivanje dodataka programskim rješenjima što za sobom povlači dodatak na već preveliku cijenu.

Pojavom programskih rješenja otvorenih kodova dosjetljivi IT stručnjaci mogli su prilagođavati sustave za automatizaciju svojim informacijskim sustavima i specifičnim zadacima. Programska rješenja prilagođena orkestraciji servisa omogućuju centralizirano upravljanje sustavima. Također, automatiziranim procesom se pristupa potrebama specifičnih aplikacija.

-- Zlatan Letica 18:01, 6. siječnja 2012. (CET)


Orkestracija i SOA

Najkraće rečeno, SOA je arhitekturalni stil u smislu IT arhitekture. Kao takav, SOA predstavlja skup odrednica koje nastoje zadovoljiti zahtjeve postavljene pred IT sada, kao i u budućnosti. Jedan od korijena SOA su upravo web servisi.

Kao jedna od najvažnijih osobina SOA arhiterturalnog stila, ističe se kombiniranje - "implementacija poslovnih procesa koje se ostvaruju kombiniranjem (orkestracija i koreografija) servisa i njihovom višekratnom uporabom" (prema Infodom - SOA). Kao sa poslovnim procesima, tako i sa web servisima, principi SOA su isti - kad jednom razvijemo kvalitetan skup servisa, trud potreban za njihovu implementaciju drastično se smanjuje.

-- Zlatan Letica 18:31, 6. siječnja 2012. (CET)

Sigurnost orkestriranja

Orkestracija, osim što ima velike uloge u smanjivanju vremenskog ljudskog tada, ima veliki utjecaj na umanjivanje mogućih pogrešaka što je njena poveznica sa SIS-om kao i manja i enkriptirana razmjena osjetljivih podataka. Automatizacijom zahtjeva prema potrebama različitih klijentskih aplikacija odstranjuju ljudsku pogrešku iz računice što direktno predstavlja sigurnije i stabilnije sustave te ekvivalentno povećava zadovoljstvo korisnika.

Sigurni prijenos paketa između glavnog poslužitelja i klijenata osigurava se prema sigurnosnim standardima posebno za svaki sustav. Kod Puppet sustava, koji je bio naš projektni zadatak, koristi se SSL te X509 PKI što će biti pojašnjeno dalje kroz tekst.

-- Zlatan Letica 18:01, 6. siječnja 2012. (CET)

Orkestracija na cloudu

Porast potrebe za orkestracijom servisa pojavljuje se kod razvoja cloud computing sustava. Sve više zastupljeni sustavi, koji su decentralizirani tj. dislocirani - koriste mrežnu infrastrukturu, zahtijevaju centralizirano upravljanje klijentima. S obzirom da se klijenti nalaze na različitim domenama, pojavljuje se potreba upravljanjem procesima s posebnom pažnjom na pojedinačne zaštite (npr. firewall) te na upravljanje iznimkama koje nastaju u različitim slučajevima.

-- Zlatan Letica 18:01, 6. siječnja 2012. (CET)

Što je Puppet?

Puppet Labs logo

Puppet je razvijen u Rubyu, licenciran kao GPLv2 i može se koristiti u klijent-server paradigmi i kao samostalna aplikacija – na računalu domaćinu gdje je instaliran (host računalo). Puppet razvijaju Luke Kanies i njegov tim iz tvrtke Puppet Labs (prijašnji Reductive Labs). Kanies je od sredine 90-ih prošlog stoljeća razvijao softver i administrirao UNIX/Linux računala pa je motiviran svojim iskustvom s radom sa softverom za automatizaciju raznih administrativnih zadaća krenuo razvijati Puppet.

Puppet se može koristi na UNIX (uključujući i OSX) i Linux platformama, a od nedavno i na Windows sustavima (Puppet 2.6.0+ verzije).

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Model Puppet infrastrukture

Puppet-model.png

Puppet infrastruktura ima jednostavan model koji se lako razumije i implementira. Model se sastoji od tri komponente:

Deployment

Puppet infrastruktura

Puppet se obično koristi u klijent-poslužitelj načinu rada. U takvom načinu rada, Puppet infrastruktura se može pojasniti sljedećim modelom.

Puppet instanca instalirana na serveru se naziva Puppet master a instanca na klijentu se naziva Puppet agent. Računalo Puppet agenta se naziva Puppet čvor (node). Puppet master je pokrenut na svom host računalu kao daemon i sadrži konfiguracijske upute za umreženi računalni sustav kojeg kontrolira – tzv. Puppet okolinu (Puppet environment). Puppet agenti se povezuju s Puppet masterom putem sigurne veze koja obuhvaća proces enkripcije podataka u razmjeni i autentikacije subjekata u vezi što je ostvareno SSL protokolom. Puppet agenti "povlače" (pull) konfiguracijske upute koje se odnose na njih i koje trebaju primijeniti na svom host računalu. Ukoliko Puppet agent nema dostupne konfiguracijske upute od Puppet mastera ili ukoliko je već primijenio dostupne konfiguracijske upute na host računalu, tada on ne čini ništa. Dakle, Puppet agent će učiniti konfiguracijske izmjene samo ukoliko su one potrebne. Cijeli ovaj proces se naziva configuration run.

Puppet agent može biti pokrenut kao daemon putem posebnih mehanizama kao što je cron, a veza s Puppet masterom može biti inicijalizirana i s unaprijed konfiguriranim okidačem (korisnički definiran trigger). Primjer najčešće prakse rada s Puppetom jest konfiguriranje Puppeta za periodičko povezivanje sa serverom za moguće nove upute kako bi svi Puppet agenti bili ažurirani (up-to-date) s najnovijim stanjem. U tom slučaju, period dohvaćanja uputa se najčešće postavlja na 30 minuta što se može konfigurirati u postavkama Puppeta.

Vrlo sličan scenarij je i kod korištenja Puppeta kao samostalne aplikacije lokalno (konfiguracijske upute s povlače s lokalnog računala, nema bitnijih razlika).

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Konfiguracijski jezik

Konfiguracijski jezik neizbježna je komponenta svih administratorskih alata iz klase aplikacija kao što je Puppet. Problemu pisanja konfiguracijskih uputa koje treba primijeniti na nekom računalu, Puppet prilazi na posve novi način.

Konfiguracijske upute Puppet definira kao upute za niz resursa koji se kontroliraju na host računalu gdje je Puppet instaliran i pokrenut. Jedan takav resurs se sastoji od sljedećih elemenata:

  1. type – tip resursa kojim se upravlja: package, servis ili cron zadaća,
  2. title – naziv tog resursa,
  3. declarations - niz deklaracija kojima su opisani atributi tog resursa tj. njegovo stanje (npr. je li servis pokrenut ili zaustavljen); deklaracije dolaze u paru atribut-vrijednost.

Način pisanja uputa je sljedeći:

type { title:

attribute => value,

}

Pod atributom se smatraju operacije koje je moguće izvoditi nad određenim tipom resursa.

Kao primjer navodimo sljedeće:

package { "vim":

ensure => present,

}

U ovom primjeru želimo utvrditi je li na određenom host računalu instalirana aplikacija vim. Atribut ensure može primiti vrijednosti present ili absent ovisno o tome da li je aplikacija instalirana ili ne.

Potpuna lista svih tipova resursa (type) kojima Puppet može upravljati je dostupna na web mjestu http://docs.puppetlabs.com/references/stable/type.html. No, također je moguće definirati i korisničke tipove resursa koje Puppet inicijalno, po defaultu, ne podržava. Valja napomenuti i kako određeni tipovi resursa imaju određene deklaracije koje su primjenjive upravo za njih ili, drugim riječima, za određeni tip resursa postoji popis podržanih atributa resursa kojima je moguće upravljati.

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Sloj poopćenja resursa

Nakon što su resursi za upravljanje opisani (konceptualno "što"), potrebno je opisati i kako upravljati tim resursima (konceptualno "kako"). Puppet je framework što znači da pokriva nekoliko različitih platformi na kojima se mogu nalaziti resursi kojima je moguće upravljati Puppetom. Te instrukcije koje se tiču upravljanja resursima, korisnik Puppeta ne treba znati niti ih treba pisati. One su unaprijed zadane za svaki tip resursa i njegove atribute koje Puppet podržava.

Prije nego se Puppet agent spaja sa Puppet masterom (ili u slučaju načina samostalnog rada), Puppet agent saznaje podatke o host računalu na kojem je instaliran – za tu svrhu koristi alat imena Facter ("onaj koji skuplja činjenice" u doslovnom prijevodu). Facter saznaje podatke o operacijskom sustavu, IP adresi računala i sl. na kojem je Puppet agent instaliran a ti se podaci koriste kako bi se saznao način za upravljanje resursom tj. dohvatile instrukcije od Puppet mastera za primjenu konfiguracijskih uputa opisanih resursa. Primjerice, nastavimo prethodni primjer, ako želimo saznati je li na nekom host računalu instalirana aplikacija vim, na Red Hat računalima trebali bi pokrenuti u naredbenom retku naredbu yum, na Ubuntu okruženju naredbu aptitude a na Solaris sustavima naredbu pkg.

Upravo ta instrukcija koja je svojstvena za svaki posebni operacijski sustav predstavlja konceptualno "kako" i najjača je karika Puppet frameworka. Korisnici Puppeta lišeni su potrebe za tako specifičnim znanjem i mogu s daljine upravljati različitim računalnim sustavima neovisno o njihovom lokalnom okruženju i konfiguraciji!

Podaci koje dohvaća Facter nazivaju se činjenice (facts) i prikazani su u ključ-vrijednost paru kao npr.:

operatingsystem => Ubuntu

ipaddress => 10.0.0.10

Skupina administratorskih alata kojima pripada Facter nazivaju se system inventory tool.

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Prijenosni sloj

Implementacija prijenosnog sloja u Puppetu je u biti njen engine, mehanizam koji je sama srž aplikacije. Upravo ova komponenta modela kojeg prakticira Puppet je zaslužna za proces konfiguriranja svakog pojedinog host računala uključujući:

Nakon što korisnik Puppeta zada opise resursa koji svi zajedno čine konfiguracijske upute, aplikacija njegove upute kompajlira u tzv. kataloge koje prosljeđuje Puppet agentima na zahtjev. Rezultat primjene konfiguracijskih uputa Puppet agent vraća natrag server aplikaciji u obliku izvješća.

Prijenosni sloj omogućuje da se konfiguracijske upute primjenjuju višestruko na više host računala. U terminologiji Puppeta ova se osobina naziva idempotent a znači upravo primjenu jedinstvenih uputa na više različitih računalnih sustava, s različitim platformama i lokalnim okruženjem, putem Puppet agenata s tim da je rezultat procesa na tim različitim sustavima jednak. Ipak, Puppetov prijenosni sloj nema sva obilježja (teoretskog modela) prijenosnog sloja budući da ne pruža neke karakteristične funkcionalnosti poput vođenja dnevnika događaja (log), roll back mogućnost i sl., mada Puppet nudi noop način rada razvijen za testiranje funkcionalnosti (no operation mode – izvršavanje, primjenjivanje konfiguracijskih uputa i prividno stvaranje promjena na host računalu, ali bez stvarnih promjena).

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Instalacija Puppeta

Puppet se može instalirati i u potpunosti koristiti na sljedećim platformama:

Na ovim platformama moguće je upravljati sa sljedećim resursima (popis nije konačan zbog mogućnosti kreiranja vlastitih korisničkih resursa za koje postoji potreba za upravljanjem):

Instalacije Puppet servera i agenta su vrlo slične. Neke platforme (koje Puppet podržava) nude instalacijske datoteke Puppet aplikacija odvojeno. Na nekim pak platformama potrebno je prethodno instalirati Ruby budući da je Puppet napisan upravo u tom programskom jeziku; potreban je Ruby interpreter. Općenito, ukoliko to nije slučaj, prije instalacije Puppeta potrebno je osigurati preduvjete za Puppet i Facter.

Preporuča se instalacija Puppeta pomoću sistemskog upravitelja instalacijama programskih sustava prvenstveno u slučajevima kad se Puppet instalira na daljinu na veći broj host računala. Osim preko spomenutog upravitelja, Puppet je moguće i instalirati iz sourcea.

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Instalacija na Debian i Ubuntu sustavima

Na Debian i Ubuntu sustavima potrebno je prethodno instalirati Ruby packages kao preduvjete za Puppet:

apt-get install ruby libshadow-ruby1.8

Zatim se instaliraju Puppet packages: puppet, puppetmaster i facter. Puppet package sadrži Puppet agenta, puppetmaster package sadrži master aplikaciju i facter package sadrži Facter alat.

Na računalu serveru potrebno je instalirati sljedeće:

apt-get install puppet puppetmaster facter

Na računalu agentu instalira se samo Puppet agent i Facter:

apt-get install puppet facter

-- Sandro Njegovan 13:26, 6. siječnja 2012. (CET)

Instalacija na Microsoft Windows sustavima

Prije instalacije Puppeta potrebno je instalirati Ruby. Najjednostavnija instalacije je preko on-click installera dostupnog na http://rubyinstaller.rubyforge.org/wiki/wiki.pl?RubyInstaller. Na http://www.ruby-lang.org/en/downloads/ može se preuzeti instalacijska datoteka. Prilikom instalacije potrebno je označiti Use RubyGems kućicu.

Pokreće se RubyGems Package Manager preko izbornika Start: Programs > Ruby-186-27 > RubyGems > RubyGems Package Manager. Otvara se naredbeni redak preko kojeg se instaliraju Facter i Puppet gemsi:

C:\gem install puppet facter

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Konfiguriranje Puppeta

puppet.conf datoteka

Konfiguriranje Puppeta se vrši ručno mijenjanjem puppet.conf datoteke najčešće smještene u /etc/puppet direktoriju (vrijedi samo za UNIX/Linux distribucije za koje su ove upute i pisane!). Ukoliko ova datoteka nije kreirana prilikom instalacije Puppeta, u naredbeni redak se zadaje naredba:

puppetmasterd --genconfig > puppet.conf

Kako bi specificirali Puppet mastera, dodajemo certname redak u puppet.conf. Redak se dodaje u [master] sekciju ove datoteke koja svojom strukturom podsjeća na uobičajene datoteke tipa INI. (Ako [master] sekcija ne postoji, kreira se!)

[master]

certname = puppet.example.com

(Zamijenite puppet.example.com sa ispravnim nazivom domene vašeg računala poslužitelja.)

Preporuča se i kreiranje DNS CNAME zapisa za zadani Puppet host (u konfiguracijskoj datoteci). Na UNIX/Linux sustavima ovo se čini izmjenom /etc/hosts:

127.0.0.1 localhost

192.168.0.1 puppet.example.com puppet

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

site.pp datoteka

Datoteka site.pp nosi informacije o konfiguracijskim uputama koje treba primijeniti na host računala Puppet agenata – informacije govore gdje se nalaze konfiguracijske upute i na koje Puppet agente se one odnose.

Ova datoteka treba biti u manifest direktoriju unutar /etc/puppet. Sve manifest konfiguracijske datoteke trebaju imati datotečni nastavak (sufiks) .pp (manifest je u terminologiji Puppeta vrsta datoteke koja sadrži konfiguracijske postavke). Manifest direktorij se obično kreira prilikom instalacije Puppeta no, ukoliko nije kreiran, u naredbenom retku zadajemo:

mkdir /etc/puppet/manifests

touch /etc/puppet/manifests/site.pp

Napomena. Puppet aplikacija se neće moći pokrenuti ako site.pp datoteka ne postoji!

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Podešavanje vatrozida (firewalla)

Puppet master koristi TCP port 8140. Ovaj port treba biti otvoren za svu komunikaciju TCP protokolom. Za Netfilter firewall unosimo pravilo:

-A INPUT -p tcp -m state --state NEW --dport 8140 -j ACCEPT

Ako želimo suziti prostor IP adresa čiji dolazni promet prihvaćamo, unosimo:

-A INPUT -p tcp -m state --state NEW -s 192.168.0.0/24 --dport 8140 -j ACCEPT

Ovo su upute na UNIX/Linux sustave, a slično treba izvesti na bilo kojoj platformi na kojoj smo instalirali Puppet a koja koristi vrstu zaštite vatrozidom.

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Povezivanje Puppet agenta i mastera

Povezivanje dislociranih instanci Puppet agenata s Puppet masterom odnosno uspostavljanje Puppet environmenta odvija se sljedećim postupkom:

  1. pokrenuti Puppet mastera na server računalu
  2. pokrenuti Puppet agente na node računalima
  3. digitalno potpisati SSL certifikate agenata (potpisuje ih Puppet master)

Nakon ova tri koraka, Puppet komunicira sigurno - ostvaruje se enkripcija i autentifikacija subjekata!

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Pokretanje Puppet mastera

Na Debian i Ubuntu sustavima, Puppet master pokrećemo sa naredbom:

invoke-rc.d puppetmaster start

(Dnevnik događaja – log, daemona kao što je Puppet na ovim sustavima nalazi pod /var/log/daemon.log.)

Pokretanjem daemona instancira se Puppet okolina što znači da se kreira lokalni Certificate Authority, certifikati i kriptografski ključevi za Puppet mastera, ali se i otvaraju mrežni socketi koji u tom trenutku izvode radno čekanje tj. čekaju na komunikaciju s Puppet agentima.

Puppet SSL podaci i certifikati se nalaze u /etc/puppet/ssl direktoriju.

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Povezivanje Puppet agenta

Pretpostavimo da pokrećemo Puppet agenta na host računalu node1.example.com koji se spaja sa svojim Puppet masterom na puppet.example.com. Zadajemo naredbu (naravno, na host računalu Puppet agenta):

puppet agent --server=puppet.example.com --no-daemonize –verbose

Zastavicom (točnije argumentom) server specificiramo domenu ili IP adresu server računala na kojeg se spajamo a gdje je pokrenut Puppet master. Druge dvije zastavice omogućuju (1) tekstualni opis događaja prilikom log zapisa (detaljniji zapisi) i (2) forsiraju pokretanje Puppet agenta kao foreground aplikacije (ne kao daemon).

Ako ne zadamo server argument, Puppet agent pretražuje lokalni DNS za izraz "puppet" – zbog toga je pametno dodati ručno CNAME zapis (opisano prethodno) ili u puppet.conf datoteci u sekciji [main] dodati npr. server = puppet.example.com.

Pokretanjem Puppet agenta, isti zahtjeva digitalno potpisivanje SSL certifikata od Puppet mastera te kreira svoj privatni kriptografski ključ za sigurnu komunikaciju. Puppet agent je i dalje pokrenut i čeka odgovor (potpisani certifikat) od Puppet mastera; čekanje se prekida jedino iznimkom kao npr. Ctrl-C pri čemu je interval provjere potpisivanja certifikata po defaultu 2 minute.

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Digitalno potpisivanje SSL certifikata

Kako bi veza između klijenta i servera odnosno Puppet agenta i mastera bila uspostavljena, potrebno je digitalno potpisati SSL certifikat kojim se ostvaruje sigurna veza između ova dva subjekta. Potpisivanje certifikata ne ide automatski već ga sistem administrator na strani servera treba "ručno" odobriti.

Za pregled certifikata na čekanju koji tek trebaju biti potpisani zadaje se naredba

puppet cert –list

a za potpisivanje određenog certifikata treba znati domenu ili IP adresu računala s kojeg dolazi zahtjev Puppet agenta – potpisivanje se vrši naredbom

puppet cert --sign node1.example.com

(Domena node1.example.com je primjera radi – koristi se u ovom tekstu radi pojednostavljenja.)

Postoji i mogućnost autosigna za automatski potpisivanje certifikata sa zadanih domena/IP adresa. Ovaj pristup ima i svojih nedostataka; rasprava o tome može se pročitati na http://puppetlabs.com/trac/puppet/wiki/FrequentlyAskedQuestions#why-shouldn-t-i-use-autosignfor-all-my-clients.

Nakon potpisivanja certifikata uspostavlja se nova veza s Puppet masterom a ona je ovaj put autentificirana. Ukoliko Puppet master nema spremnih konfiguracija za tek verificiranog Puppet agenta, javlja se upozorenje o nepostojećim konfiguracijskim uputama (katalozima) za preuzimanje – ova je greška sasvim u redu.

-- Sandro Njegovan 13:42, 6. siječnja 2012. (CET)

Primjer potpisanog SSL certifikata

Jednom kreiran certifikat nalazi se u direktoriju (po defaultnim postavkama):

/var/lib/puppet/ssl/certs/

Naredbom

openssl x509 –text –in /var/lib/puppet/ssl/certs/naziv_certifikata

... ispisuje se isti:

 Certificate: 
   Data: 
      Version: 3 (0x2)
       Serial Number: 3 (0x3)
       Signature Algorithm: sha1WithRSAEncryption
       Issuer: CN=Puppet CA: host
       Validity
           Not Before: Jan  4 22:21:45 2012 GMT
           Not After : Jan  3 22:21:45 2017 GMT
       Subject: CN=puppet.host
       Subject Public Key Info:
           Public Key Algorithm: rsaEncryption
               Public-Key: (1024 bit)
               Modulus:
                   00:a1:b6:cd:7a:b2:c6:87:64:d7:6d:42:b1:ad:2d:
                   12:82:88:ac:eb:e8:ac:34:20:55:c0:4f:16:d7:e0:
                   b1:db:76:46:fd:b9:4a:0f:4b:42:c1:a6:0c:f9:76:
                   55:f1:cc:7b:05:76:69:8c:6e:ac:fd:01:a5:e1:1f:
                   dd:8f:b6:5e:30:6b:8c:31:c8:40:18:a8:b3:90:c8:
                   6a:1c:78:05:35:2b:17:22:22:04:0a:51:0d:5f:4e:
                   7f:10:83:9d:b0:0c:25:23:40:69:7a:05:09:8c:16:
                   8a:9a:83:a9:44:44:e6:4e:6d:e1:13:13:6c:18:af:
                   7f:eb:a4:f7:7a:10:15:ed:b3
               Exponent: 65537 (0x10001)
       X509v3 extensions:
           X509v3 Basic Constraints: critical
               CA:FALSE
           Netscape Comment: 
               Puppet Ruby/OpenSSL Internal Certificate
           X509v3 Key Usage: critical
               Digital Signature, Key Encipherment
           X509v3 Subject Key Identifier: 
               2A:A9:43:34:7E:C1:A0:B2:33:A7:3B:E2:32:A6:77:26:C4:4D:05:4C
           X509v3 Extended Key Usage: critical
               TLS Web Server Authentication, TLS Web Client Authentication
   Signature Algorithm: sha1WithRSAEncryption
       21:15:a6:dd:8d:72:e6:df:85:b2:92:7a:af:b6:c3:2d:45:6f:
       b1:30:1c:a5:ba:9d:fb:42:f6:bf:c2:0d:83:bd:e7:f5:c5:da:
       b9:a7:52:89:b0:12:2a:bd:76:98:cd:54:0f:25:a7:65:6f:eb:
       e2:c0:c3:33:c3:26:78:42:e4:7c:cc:3f:a2:1e:0b:a8:44:54:
       e7:dc:82:4f:8a:2a:0c:46:68:f5:45:97:a0:5c:a9:11:6e:c5:
       6c:50:86:af:9d:49:1d:48:e0:b9:f5:88:00:1e:22:6e:9e:93:
       c9:bc:1a:0c:02:9a:7d:2e:74:1f:35:7d:2c:a7:e8:f8:93:46:
       c2:50
 BEGIN CERTIFICATE 
   MIICQjCCAaugAwIBAgIBAzANBgkqhkiG9w0BAQUFADAaMRgwFgYDVQQDDA9QdXBw
   ZXQgQ0E6IGhvc3QwHhcNMTIwMTA0MjIyMTQ1WhcNMTcwMTAzMjIyMTQ1WjAWMRQw
   EgYDVQQDDAtwdXBwZXQuaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
   obbNerLGh2TXbUKxrS0Sgois6+isNCBVwE8W1+Cx23ZG/blKD0tCwaYM+XZV8cx7
   BXZpjG6s/QGl4R/dj7ZeMGuMMchAGKizkMhqHHgFNSsXIiIEClENX05/EIOdsAwl
   I0BpegUJjBaKmoOpRETmTm3hExNsGK9/66T3ehAV7bMCAwEAAaOBmzCBmDAMBgNV
   HRMBAf8EAjAAMDcGCWCGSAGG+EIBDQQqFihQdXBwZXQgUnVieS9PcGVuU1NMIElu
   dGVybmFsIENlcnRpZmljYXRlMA4GA1UdDwEB/wQEAwIFoDAdBgNVHQ4EFgQUKqlD
   NH7BoLIzpzviMqZ3JsRNBUwwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUF
   BwMCMA0GCSqGSIb3DQEBBQUAA4GBACEVpt2NcubfhbKSeq+2wy1Fb7EwHKW6nftC
   9r/CDYO95/XF2rmnUomwEiq9dpjNVA8lp2Vv6+LAwzPDJnhC5HzMP6IeC6hEVOfc
   gk+KKgxGaPVFl6BcqRFuxWxQhq+dSR1I4Ln1iAAeIm6ek8m8GgwCmn0udB81fSyn
   6PiTRsJQ
 END CERTIFICATE

-- Zlatan Letica 19:01, 6. siječnja 2012. (CET)

Praktični primjer povezivanja Puppet agenta i mastera (s screenshotovima)

Korišteni elementi za praktični primjer:

U trenutku kada su pokrenuti i Puppet master i Puppet agent, agent naredbom

puppet agent --server=puppet.host --no-daemonize –verbose

... inicijalizira povezivanje s masterom. Na Puppet agent node računalu pojavljuju se sljedeće informativne naredbe koje izvještavaju:

Kada su ovi koraci izvršeni, Puppet agent čeka potpisani certifikat od strane mastera.

Sis1.PNG

Na strani Puppet mastera prikazuju se dobiveni zahtjevi za certificiranje naredbom:

puppet cert --list

... te se isti po želji Puppet mastera potpisuju sa:

puppet cert –sign client

Sis2.PNG

Jednom potpisan certifikat omogučuje autentifikaciju Puppet mastera i Puppet agenta što je vidljivo na strani agenta.

Sis3.PNG

-- Zlatan Letica 18:47, 6. siječnja 2012. (CET)

MySQL i Puppet

Za ovaj primjer kreirati ćemo takozvanu novu konfiguraciju koju će Puppet agent pokretati prilikom pokretanja. Prvi korak je izmjena datoteke /etc/puppet/manifests/site.pp.

Ta datoteka je do sada bila prazna (samo postojanje je bilo potrebno za pokretanje Puppeta) te ćemo je sada nadopuniti s sljedećim kodom:

import 'primjer.pp'

$mysql_password="pass1950"

Naredba import definira pokretanje datoteke primjer.pp, dok druga linija koda predstavlja varijablu (varijable se označavaju s znakom $) koja će nam biti potrebna poslije.

Drugi korak je kreiranje datoteke primjer.pp

touch /etc/puppet/manifests/primjer.pp

sa sljedećim kodom

node 'puppet.client' { include mysql }

S node definiramo klijenta (puppet.client) te pridružujemo istom pokretanje MySQL modula.

Treći korak je kreiranje samog modula.

Svaki modul zahtjeva specifičnu strukturu direktorija i datoteku init.pp. Definirana struktura omogućava željenu automatizaciju.

Za početak je potrebno u prije spomenutoj datoteci puppet.conf pod [main] sekciju upisati lokaciju direktorija

moduledir = /etc/puppet/modules:/var/lib/puppet/modules:/opt/modules

... te nakon toga kreirati sam direktorij i datoteku init.pp sa:

mkdir –p /etc/puppet/modules/mysql/{files,templates,manifests}

touch /etc/puppet/modules/mysql/manifests/init.pp

Unutar datoteke init.pp upisujemo sljedeći kod:

class mysql{
 package { "mysql-server": ensure => installed }
 package { "mysql": ensure => installed }
 service { "mysqld":
   enable => true,
   ensure => running,
   require => Package["mysql-server"],
 }
 file { "/var/lib/mysql/my.cnf":
   owner => "mysql", group => "mysql",
   source => "puppet:///mysql/my.cnf",
   notify => Service["mysqld"],
   require => Package["mysql-server"],
 }
  file { "/etc/my.cnf":
   require => File["/var/lib/mysql/my.cnf"],
   ensure => "/var/lib/mysql/my.cnf",
 }
 exec { "set-mysql-password":
   unless => "mysqladmin -uroot -p $mysql_password status",
   path => ["/bin", "/usr/bin"],
   command => "mysqladmin -uroot password $mysql_password",
   require => Service["mysqld"],
 }
}

Sada imamo osigurano da će svaki Puppet agent jednom (prvi put) kada je spojen na Puppet mastera konfigurirati MySQL sustav.

Primjer je preuzet sa http://bitfieldconsulting.com/puppet-and-mysql-create-databases-and-users.

-- Zlatan Letica 20:02, 6. siječnja 2012. (CET)

WordPress i Puppet

U ovom poglavlju je opisan primjer instalacije poznate blogging platforme WordPress pomoću Puppeta. Primjer je nastao po uzoru na tutorial s web mjesta Shane's Blog a u skladu s instalacijskim uputama WordPressa prema tutorialu s web mjesta Wordpress.org: Installing WordPress.

Puppet manifest za automatsku instalaciju WordPress sustava pomoću Puppeta je poprilično jednostavan budući da je instalacijska datoteka WordPressa dostupna online sa službenih stranica u obliku .zip arhive (WordPress tarball). Također, pretpostavlja MySQL, poznate login podatke korisnika baze podataka s potrebnim privilegijama i da je datoteka wp-config-sample.php preimenovana u wp-config.php.

Najprije osigurajmo rad s bazom podataka.

CREATE DATABASE database;

GRANT ALL PRIVILEGES ON database* TO "db_user"@"localhost" IDENTIFIED BY "db_pass";

[Ovo je također moguće izvesi automatizmom preko Puppet, ali nam nažalost nije uspjelo. :)]

Uz to, jedini preostali zadatak koji treba obaviti "ručno" (budući da Puppet automatizmom rješava sve) jest u site.pp definirati novi Wordpress blog pomoću:

wordpress { "blog.primjer.hr":
   domain => "blog.primjer.hr",
   path => "/lokacija/mog/bloga",
   db => "sis_baza",
   db_user => "sis",
   db_pass => "sis1",
}

Definirani parametri se tumače na sljedeći način. WordPress blog se instalira na domeni domain, na lokaciji path na domain-host računalu. WordPress koristi bazu podataka db kao korisnik s korisničkim imenom db_user i zaporkom db_pass.

Slijedi wordpress.pp datoteka.

define wordpress($domain, $path, $db, $db_user, $db_pass) {
   $auth_key = sha1("auth_key$name")
   $secure_auth_key = sha1("secure_auth_key$name")
   $logged_in_key = sha1("logged_in_key$name")
   $nonce_key = sha1("nonce_key$name")
   $auth_salt = sha1("auth_salt$name")
   $secure_auth_salt = sha1("secure_auth_salt$name")
   $logged_in_salt = sha1("logged_in_salt$name")
   $nonce_salt = sha1("nonce_salt$name")
   include mysql-server-50
   # php5 auto-includes apache2
   include php5
   file { "$path":
       ensure => "directory",
       source => "puppet://puppet.primjer.hr/dist/apps/wordpress/wordpress",
       recurse => "true",
       force => true,
       mode => "0644",
   }
   file { "$path/wp-config.php":
       content => template("/etc/puppet/dist/apps/wordpress/wp-config.php.erb"),
       mode => "0644",
       require => File["$path"],
   }
   file { "$path/wp-content/plugins":
       source => "puppet://puppet.primjer.hr/dist/apps/wordpress/plugins",
       recurse => "true",
       force => true,
       group => "www",
       mode => "0644",
       require => File["$path"],
   }
}

Prava pristupa za pisanje potrebno je omogućiti sljedećim datotekama i putanjama:

Primjer za to u Puppet sintaksi je napisan ovdje (po jedan primjer za datoteku i putanju):

file { "$path/.htaccess":
    ensure => "file",
    group => "www",
    mode => "0664",
    require => File["$path"],
}
file { "$path/wp-content/cache":
    ensure => "directory",
    group => "www",
    mode => "0664",
    require => File["$path/wp-content/plugins"],
}

Napomena. 0664 mode znači prava (permissions) RW, RW, R respektivno (R - read, W - write).

Posljednja stvar koju treba objasniti jest wp-config.php datoteka. Ona je generiran iz wp-config.php.erb predloška. Generiranje iz predloška je definirano sljedećom linijom koda u wordpress.pp datoteci (pažnja - ovo je samo copy & paste linije!):

content => template("/etc/puppet/dist/apps/wordpress/wp-config.php.erb"),

Slijedi wp-config.php.erb datoteka.

define('DB_NAME', '<%= db %>');
define('DB_USER', '<%= db_user %>');
define('DB_PASSWORD', '<%= db_pass %>');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', );
define('AUTH_KEY',         '<%= auth_key %>');
define('SECURE_AUTH_KEY',  '<%= secure_auth_key %>');
define('LOGGED_IN_KEY',    '<%= logged_in_key %>');
define('NONCE_KEY',        '<%= nonce_key %>');
define('AUTH_SALT',        '<%= auth_salt %>');
define('SECURE_AUTH_SALT', '<%= secure_auth_salt %>');
define('LOGGED_IN_SALT',   '<%= logged_in_salt %>');
define('NONCE_SALT',       '<%= nonce_salt %>');
$table_prefix  = 'wp_';
define ('WPLANG', );
define('WP_DEBUG', false);
define('WP_CACHE', true);
if ( !defined('ABSPATH') )
   define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');

Ovim su kreirane konfiguracijske upute kojima se instalira WordPress, valjani wp-config.php, željeni pluginovi i postavljaju prava pristupa (za pisanje) na određene direktorije kako bi pluginovi funkcionirali ispravno (a njihova instalacija bila uspješna).

Nakon što Puppet agent instalira i podesi WordPress, potrebno je s web preglednikom (Firefox, Chrome, Opera, IE, ...) posjetiti http://<domain>/ i dovršiti instalaciju WordPressa. (Napomena! Isti onaj domain kao u definiciji bloga u site.pp datoteci.)

Primjer Puppet manifesta za instalaciju WordPressa vrlo sličan uputama iz ovog tutoriala dostupan je na githubu na adresi https://github.com/simpsonjulian/puppet-wordpress.

-- Sandro Njegovan 23:24, 6. siječnja 2012. (CET)

Za dodatno čitanje

--Sandro Njegovan 11:03, 16. siječnja 2012. (CET)

Izvori

  1. Orchestration - http://en.wikipedia.org/wiki/Orchestration_(computing)
  2. Infodom.hr: SOA arhitektura - http://www.infodom.hr/default.aspx?id=536
  3. Introduction to Puppet - http://docs.puppetlabs.com/guides/introduction.html
  4. Puppet Installation - http://docs.puppetlabs.com/guides/installation.html
  5. Puppet Configuration Guide - http://docs.puppetlabs.com/guides/configuring.html
  6. Puppet Configuration Reference - http://docs.puppetlabs.com/references/stable/configuration.html
  7. MySQL i Puppet - http://bitfieldconsulting.com/puppet-and-mysql-create-databases-and-users
  8. WordPress i Puppet - http://blog.shanemeyers.com/2010/09/14/installing-wordpress-via-puppet/
Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima