Instaliranje lutke. Centralizirana konfiguracija UNIX sistema koristeći Puppet

Dom / Mobilni uređaji

Ne tako davno, na stranicama časopisa, pogledali smo sistem daljinski upravljač konfiguraciju UNIX mašina Cfengine, koji uvelike pojednostavljuje život administratora sistema automatizacijom koraka za konfigurisanje mnogih mrežnih čvorova. Ali, bez obzira na to koliko je Cfengine zgodan, ima mnogo nedostataka koje sistem koji se zove Puppet nema.

Zamislite sebe u ulozi sistem administratora, odgovornog za održavanje funkcionalnosti stotina mašina koje rade pod operativnim sistemima tipa UNIX. Svaki od njih zahtijeva konfiguraciju, periodično ažuriranje i praćenje, a pretpostavlja se da mnogi od njih obavljaju slične funkcije.

Dvije trećine su radne stanice, još nekoliko rutera, ostalo nekoliko web servera i skladištenja podataka. Pitanje: kako upravljati svim ovim poslom? Najjednostavniji odgovor je jednostavno se povezati sa svakim od njih pomoću SSH-a i napraviti potrebne promjene. Međutim, ova metoda ima dva problema. Prvo, veoma je radno intenzivan. Drugo, administrator će stalno morati da izvodi mnoge monotone radnje (na primer, da biste ažurirali OpenOffice.org na svim radnim stanicama, moraćete da izvršite iste komande nekoliko desetina puta). Možete pokušati izbjeći ovaj problem tako što ćete napisati nekoliko skripti koje će se same povezati na svaku mašinu i izvršiti unaprijed napisane komande. Ali i ovdje vas čekaju problemi.

Skripte će se stalno morati modificirati kako bi se prilagodile svakom zadatku; Skripte će morati da uzmu u obzir razlike u operativnim sistemima i verzijama i moraće da budu otklonjene dugo vremena pre nego što se primene na pokrenute mašine. Općenito, ne comme il faut. Tačan odgovor je korištenje tzv. daljinskog upravljanja konfiguracijom, čiji su najpoznatiji predstavnici otvoreni sistemi Cfengine i lutka. Takvi sistemi preuzimaju svu odgovornost za dovođenje konfiguracije mašine pravi tip, zahtijevajući od administratora samo da opiše konačno stanje sistema na posebnom jeziku (na primjer, opis koji paketi treba instalirati u OS, koje linije treba dodati u konfiguracijske datoteke, koje naredbe treba izvršiti itd. ). Nakon toga, svi čvorovi će sami dobiti informacije o potrebnom stanju od servera i automatski konfigurisati sistem. Zahvaljujući ovom mehanizmu, nove mašine se mogu u potpunosti konfigurisati bez ljudske intervencije, a postojeće se mogu rekonfigurisati dodavanjem samo nekoliko redova u opis stanja.

Lutka?

Cfengine sistemu smo već posvetili cijeli članak, tako da ćemo se danas fokusirati na Puppet sistem, koji se može nazvati njegovim ideološkim nasljednikom. Puppet je razvio Luke Kanies, koji se umorio od Cfengineovih ograničenja i odlučio je napraviti bolju verziju od nule. Ako ste već koristili Cfenfine, vjerojatno ćete pronaći Puppet praktičniji i moćniji sistem. Državni jezik lutke je višeg nivoa i fleksibilniji, tako da administratori ne moraju brinuti o stvarima poput pisanja zasebnih pravila za svaki tip OS-a ili detaljan opis izvođenje trivijalnih radnji. Puppet omogućava svom gospodaru da se fokusira na ono što želi da radi, umjesto na to kako to učiniti (na primjer, da biste instalirali određeni paket na bilo koji od podržanih OS-a, samo trebate napisati bukvalno nekoliko redova koji govore "Instaliraj ovaj program " umjesto opisa naredbi neophodnih za njegovu instalaciju). Puppet je napisan jednostavnim Ruby jezikom, što ga čini lakim za prilagođavanje određenom zadatku i proširenje njegove funkcionalnosti (omogućen je fleksibilan sistem dodataka).

Dodatno, za razliku od Cfengine razvojnog modela, koji se u suštini vrti oko jedne osobe, Puppet ima veliku zajednicu entuzijasta koji poboljšavaju kod, dijele primjere konfiguracije i pišu dokumentaciju.

Sve u svemu, čini se da je Puppet moderniji i dobro osmišljen sistem dobar dizajn. Kao i Cfengine, podržava skoro sve moderne operativne sisteme slične UNIX-u (uključujući MacOS X), a takođe može da radi u Cygwin okruženju na vrhu Windows-a. Njegova lista zavisnosti uključuje samo Ruby interpreter i Factor alat, tako da ne bi trebalo biti problema sa instalacijom (da budemo pošteni, Cfengine-ova lista zavisnosti je još kraća).

Instalacija

Kao i Cfengne, Puppet je klijent-server sistem koji se sastoji od kontrolnog servera i slave čvorova. Server pohranjuje opis konačnih stanja čvorova (koji se u terminima lutke naziva manifest) i čeka da se povežu. Svakih pola sata (podrazumevano) klijent se povezuje sa serverom, dobija od njega opis konačnog stanja, upoređuje ga sa trenutnim i, ako se ono i/ili opisano stanje promenilo, rekonfiguriše sistem i onda ide na spavanje. Komunikacija se odvija preko šifrovanog kanala, tako da su napadi zasnovani na zamjeni opisa stanja isključeni (ali ako napadač preuzme server, tada će svi čvorovi biti pod njegovom kontrolom).

Puppet je uključen u repozitorije svih popularnih distribucija, tako da njegova instalacija ne bi trebala biti teška. Na primjer, na Debian/Ubuntu klijent Puppet se može instalirati ovako:

$ sudo apt-get install puppet

A server je ovakav:

$ sudo apt-get install puppet puppetmaster

Datoteke konfiguracije klijenta i servera pohranjene su u direktoriju /etc/puppet. Najvažniji od njih je datoteka /etc/puppet/manifests/site.pp, koja sadrži manifest.

Pohranjuje opis stanja i treba da postoji samo na serveru. Radi lakšeg otklanjanja grešaka, dodajmo jednostavnu konfiguraciju:


class passwd(
fajl("/etc/passwd":
vlasnik => root,
grupa => root,
mod => 644,
}
}
zadani čvor (
uključi passwd
}

Ovi redovi opisuju stanje u kojem vlasnik /etc/passwd fajla mora biti root i njegove dozvole su postavljene na 644. Pobliže ćemo pogledati format datoteke manifesta u sljedećem odjeljku. Drugi najvažniji fajl je /etc/puppet/puppet.conf. On postavlja konfiguraciju servera i klijenata, tako da mora biti prisutan na svim mašinama organizovanim u Puppet mreži. U Ubuntu-u ova datoteka sadrži minimalno potrebne i u većini slučajeva dovoljne postavke. U nastavku su dati sa komentarima:

# vi /etc/puppet/puppet.conf
# Standardne putanje direktorija
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
# Faktorska lokacija alata,
# koristi se za dobijanje informacija o OS-u
factpath=$vardir/lib/facter
# Sinhronizirajte dodatke
# (instalirani dodaci na serveru - kopiraju se na klijente)
pluginsync=true
# Katalog sa šablonima (o njima pročitajte u nastavku)
templatedir=$confdir/templates
# Sinhronizacija sa etckeeperom
# (ko zna, shvatiće, drugima ne treba)
prerun_command=/etc/puppet/etckeeper-commitpre
postrun_command=/etc/puppet/etckeeper-commitpost

Konfiguracijski fajl može uključivati veliki broj razne opcije, informacije o kojima se mogu dobiti generiranjem zadane konfiguracije:

$ sudo puppetmasterd -genconfig > /etc/puppet/
puppetd.conf.default

Zadana konfiguracija klijenta se generira pomoću druge naredbe:

$ sudo puppet -genconfig > /etc/puppet/puppetd.conf.default

Za konfiguraciju se koriste datoteke Fileserver.conf i auth.conf server datoteka(pročitajte o tome u odjeljku “File Server”) i autentifikaciju. Još nema smisla dirati ih. Kada je konfiguracija završena, Puppet server se mora ponovo pokrenuti:

$ sudo /etc/init.d/puppetmaster restart

Nakon toga će biti spreman da prihvati zahtjeve kupaca. Međutim, bez potpisanog certifikata, nijedan klijent neće moći primiti manifest od servera i konfigurirati stroj.

Stoga moramo pokrenuti klijente Puppet u test modu kako bi mogli predati svoje certifikate serveru na potpisivanje (usput, to se može učiniti na svim mašinama istovremeno pomoću alata shmux):

$ sudo puppetd -server puppet-server.com -verbose -test

Vraćamo se na server i dobijamo listu certifikata spremnih za potpisivanje:

$ sudo puppetca --list

Odaberite host sa liste i potpišite njegov certifikat:

$ sudo puppetca --sign nomad.grinder.com

Ili potpisujemo sve odjednom:

$ sudo puppetca --sign --sve

Sada možete pokrenuti klijente u borbenom modu. Ali prvo morate unijeti ime servera Puppet u konfiguracijski fajl (po defaultu njegovo ime je samo lutka):

$sudo su
# echo "" >> /etc/puppet/puppet.conf
# echo "server=puppet-server.com" >> /etc/puppet/puppet.conf
# izlaz

Pokretanje klijenata:

$ sudo /etc/init.d/puppet start

Jezik opisa stanja

Kao što je gore spomenuto, Puppet koristi svoj jezik za opisivanje konačnog stanja operativni sistem, uz pomoć kojeg administrator sistema ukazuje u koji oblik komponente OS-a treba dovesti da bi on postigao željeno stanje. Ovo je prilično složen jezik, koji je ipak mnogo jednostavniji od bilo kojeg programskog jezika. Ako ste barem površno upoznati sa skriptnim jezikom bash, lako ćete razumjeti jezik lutke. Ključni element jezika su resursi koji se koriste za opisivanje oblika u koji treba konvertovati jednu od komponenti OS-a. Na primjer, sljedeći jednostavan resurs opisuje željeno stanje datoteke /etc/passwd:

# vi /etc/puppet/manifests/site.pp
fajl("/etc/passwd":
vlasnik => "root"
}

Ovdje je datoteka tip resursa. Ukupno ih ima nekoliko desetina, u rasponu od resursa koji upravljaju datotekama, kao u ovom primjeru, do paketa i usluga. Red /etc/passwd je ime resursa.

U slučaju tipa datoteke, ime je isto kao i putanja do datoteke, ali u nekim drugim tipovima ime može biti proizvoljno. Vlasnik linije => "root" opisuje postavljanje atributa vlasnika na root, odnosno kaže da je vlasnik specificirani fajl mora postojati administrator.

Svaka vrsta resursa ima svoj skup atributa dostupnih za modifikaciju, plus postoje posebni meta atributi koji se mogu koristiti u bilo kojem resursu. Jedan od važnih kvaliteta resursa je sposobnost povezivanja sa njima. Ovo se može koristiti za formiranje lanaca zavisnosti. Sljedeći unos kreira /etc/group resurs, koji ovisi o /etc/passwd resursu (zavisnosti su specificirane pomoću meta atributa require):

# vi /etc/puppet/manifests/site.pp
fajl("/etc/group":
zahtijeva => Fajl["/etc/passwd"],
vlasnik => "root",
}

To znači da se /etc/group resurs može konfigurirati (dovesti u opisani oblik) samo kada je konfiguriran /etc/passwd resurs. Resursi se mogu grupirati u kolekcije resursa koje se nazivaju klase. Ovo je neophodno kako bi se resursi slični po značenju i vrsti obavljenog zadatka spojili u jedan apstraktni resurs. Na primjer, radi praktičnosti, mogli bismo kombinirati instalaciju i pokretanje nginx web servera u jedan apstraktni izvor istog imena:

# vi /etc/puppet/manifests/site.pp
klasa nginx(
paket("nginx":
osigurati => instaliran
}
service("nginx":
osigurati => trčanje,
zahtijeva => Paket["nginx"],
}
}

Ovdje se tip resursa paketa koristi za instaliranje nginx paketa na sistem, a usluga se koristi za pokretanje servisa istog imena. Sa zahtjevom prisiljavamo sistem da pokrene uslugu samo ako je paket uspješno instaliran. Pogodnost časova je što se mogu uključiti iu zavisnosti od:

# vi /etc/puppet/manifests/site.pp
service("squid":
osigurati => trčanje,
zahtijeva => Class["nginx"],
}

Kao iu pravim OOP jezicima, klase mogu naslijediti jedna od druge i nadjačati atribute:

# vi /etc/puppet/manifests/site.pp
class passwd(
fajl("/etc/passwd":
vlasnik => "root",
grupa => "korijen",
}
}
klasa passwd-bsd nasljeđuje passwd (
Fajl["/etc/passwd"] (grupa => "točak")
}

Ovdje passwd-bsd klasa nasljeđuje od passwd kako bi nadjačala atribut grupe resursa /etc/passwd (na BSD sistemima /etc/passwd pripada grupi kotača, tako da smo kreirali posebnu klasu za takve sisteme). Kasnije ćemo pogledati ispravniji i očigledniji način odabira alternativnih vrijednosti atributa koristeći uvjete.

Varijable su jedna od bitnih komponenti svakog programskog jezika, a ima ih i Puppet. Varijable počinju sa znakom $ i mogu sadržavati bilo koji broj, niz ili boolean vrijednost(tačno, netačno):

$want_apache = istina
$apache_version = "2.2.14"

Jedna od najmoćnijih karakteristika Puppet-a vezanih za varijable je njegova integracija sa alatom za informacije o faktorima. Ovaj uslužni program vraća sve informacije specifične za stroj u obliku parova ključ/vrijednost, koji se pretvaraju u varijable istog imena u Puppet-u. Zajedno sa uslovnim uputstvima u jeziku lutke, mogu se koristiti za izmenu atributa resursa u zavisnosti od svojstava mašine.

Na primjer, klasa passwd koja je gore opisana može se lako prepisati kako bi automatski izabrala atribut ovisno o tipu OS-a (bez potrebe da sama klasa):

# vi /etc/puppet/manifests/site.pp
fajl("/etc/passwd":
vlasnik => "root",
grupa => $kernel ? (
Linux => "root",
FreeBSD => "točak",
},
}

Ovisno o tome na kojem će OS-u ovaj fragment manifesta biti analiziran, vrijednost atributa grupe će biti korijen ili kotač. Osim uslovni operator, jezik Puppet također podržava operator odabira slučaja, koji se može koristiti za kreiranje određenog resursa ovisno o vrijednosti varijable:

# vi /etc/puppet/manifests/site.pp
case $operativni sistem (
redhat: (service("httpd": osigurati => pokrenut))
debian: (service("apache": osigurava => radi))
default: ( usluga ( "apache2": osigurati =>
trčanje))
}

Ovaj kod definira razne opcije resurs tipa servisa u zavisnosti od operativnog sistema (nazivi servisa u različitim distribucijama Linuxa mogu se razlikovati, tako da se za svaku od njih mora posebno navesti koji servis Puppet treba da pokrene).

Zadana opcija se koristi ako vrijednost varijable ne odgovara nijednoj od prethodnih opcija. Pored prethodno razmatranih tipova resursa datoteka, paketa i usluga, Puppet podržava veliki broj drugih tipova resursa, uključujući i one koje su kreirali programeri treće strane. Njihov detaljan opis, uključujući primjere, podržane atribute i karakteristike, možete pronaći u službenoj dokumentaciji - http://docs.puppetlabs.com/references/stable/type.html. Ispod je lista i kratak opis najčešće korišćeni su:

Popularne vrste resursa za lutke

  • cron - upravljajte cron poslovima
  • exec - pokrenite skripte i komande
  • fajl - upravljanje fajlovima
  • filebucket - backup datoteke
  • grupa - upravljanje grupom
  • host - upravlja unosima u /etc/hosts datoteci
  • interfejs - konfiguracija mrežnih interfejsa
  • mount - montiranje sistema datoteka
  • obavijesti - pošalji poruku u datoteku dnevnika Puppet
  • paket - upravljanje paketima
  • usluga - upravljanje uslugama
  • sshkey - upravljanje SSH ključevima
  • uredno - brisanje datoteka u zavisnosti od uslova
  • upravljanje korisnikom
  • zone - Solaris zonsko upravljanje

Drugi najvažniji element jezika lutke nakon resursa su čvorovi. Uz njihovu pomoć administrator može opisati na koje mašine treba primijeniti određene resurse i klase. Drugim riječima, to je način da se specificira individualna konfiguracija za svaku od mašina koje sudjeluju u Puppet mreži. Najjednostavniji primjer čvora dat je na početku članka u odjeljku "Instalacija":

# vi /etc/puppet/manifests/site.pp
zadani čvor (
uključi passwd
}

Ovo je definicija zadanog čvora, koji uključuje passwd resurs/klasu. Podrazumevano ime znači "svi ostali čvorovi", tako da će passwd resurs/klasa definirana negdje gore biti konfigurisana na svakom od njih. Ovdje se koristi ključna riječ radi praktičnosti, sve klase i resursi se mogu opisati direktno u opisu čvora, ali to se ne preporučuje. Osim zadanog, u nazivu čvora možete odrediti mrežni naziv stroja (tada će svi resursi opisani u čvoru biti konfigurirani samo na ovom stroju), ili proizvoljno ime (tada ovaj čvor može naslijediti drugi čvor) . Da bismo razumjeli kako sve ovo funkcionira zajedno s klasama i resursima, pogledajmo primjer gotovog manifesta lutke koji se koristi za konfiguriranje dvije mrežne mašine (web server i NTP server):

# vi /etc/puppet/manifests/site.pp
# Instaliranje i pokretanje SSH servera
klasa sshd (
paket ( openssh-server: osigurati => instaliran)
usluga (sshd:
name => $operatingsystem ? (
fedora => "sshd",
debian => "ssh",
default => "sshd",
},
omogući => tačno,
osigurati => trčanje,
}
}
# Instalirajte i pokrenite Apache
klasa httpd(
paket ( httpd: osigurati => instaliran)
usluga (httpd:
omogući => tačno,
osigurati => trčanje,
}
}
# Instaliranje i pokretanje NTP servera
klasa ntpd(
paket (ntp-server: osigurati => instaliran)
usluga (
ntp-server:
omogući => tačno,
osigurati => trčanje,
}
}
# Osnovni čvor, koji se koristi samo kao roditelj svih ostalih
baza čvora (
uključiti sshd
}
# Čvor na kojem će se web server nalaziti
čvor web.server.com nasljeđuje bazu (
uključuje httpd
}
# Čvor NTP servera
čvor ntp.server.com nasljeđuje bazu (
uključiti ntpd
}

Ova naizgled jednostavna konfiguracija čini dosta: instalira i pokreće Apache na mašini na web.server.com i NTP server instalira i radi na mašini. ntp.server.com. Dodatno, obje mašine instaliraju SSH server. Ova konfiguracija vjerovatno neće odgovarati čak ni jednom administratoru; moraće biti ozbiljno poboljšan kako bi se naučio kako pravilno konfigurirati servere, primati svježe konfiguracije i druge datoteke sa glavnog Puppet servera.

Međutim, to jasno pokazuje moć lutke. Koristeći jednostavnu konfiguraciju, natjerali smo mašine da same instaliraju i pokreću potreban softver i održavaju ga u ispravnom stanju (ako se server sruši, sam Puppet će se rekonfigurirati da dovede sisteme u potrebno stanje).

File server

Mnogi zadaci udaljene administracije ne mogu se riješiti bez kopiranja na mašine dodatni fajlovi. To mogu biti unaprijed pripremljene konfiguracije, web stranice za Apache, paketi koji nisu u službenom spremištu i još mnogo toga. Da bi se olakšao proces prijenosa ovih datoteka na udaljene hostove, Puppet uključuje server datoteka.

Postavke servera datoteka pohranjene su u datoteci /etc/puppet/fileserver.conf. Da biste prisilili Puppet da klijentima služi sadržaj određenog direktorija, morate u njega staviti nekoliko redaka:

# vi /etc/puppet/fileserver.conf
put = /var/puppet/files
dozvoli *.server.com

Ove dvije linije označavaju da bi direktorij /var/puppet/files trebao biti dostupan svim hostovima u domeni server.com. Osim toga, možemo specificirati puno ime domene dozvoljenog stroja ili njegovu IP adresu, a također i odsjeći neželjene koristeći deny direktivu. Bilo koja datoteka u tom direktoriju se tada može premjestiti na klijenta koristeći resurs datoteke. na primjer:

# vi /etc/puppet/manifests/site.pp
file("/etc/httpd/conf/httpd.conf":
izvor => "puppet://httpd/httpd.conf",
mod => 644,
}

Datoteka httpd.conf, koja se nalazi na serveru u direktoriju /var/puppet/files/httpd, biće kopirana na ciljnu mašinu duž putanje navedenog u imenu resursa.

Zaključci

U ovom članku pokrili smo vrlo mali dio Puppet-ovih mogućnosti. U stvari jeste složen sistem, koji se može u potpunosti opisati samo na stranicama knjige. U isto vrijeme, Puppet je vrlo lako konfigurirati i održavati, pogotovo jer možete pronaći mnogo primjera njegove konfiguracije na Internetu.

Info

  • Puppet koristi HTTP protokol, tako da se može pokrenuti pod web serverom radi poboljšanja performansi.
  • Puppet se može koristiti za automatsko konfiguriranje i održavanje jedne lokalne mašine.
  • Kombinacijom Puppet-a, mrežne instalacije OS-a (pxe-install) i instalacijskih slika za samogradnju, možete kreirati potpuno samokonfigurirajuću mrežu strojeva koja se može implementirati samo jednom naredbom.
  • Mnoge velike kompanije koriste Puppet u svom radu, kao što su Google, Fedora Project, Stanford University, Red Hat, Siemens IT Solution i SugarCRM.

Linkovi

  • http://docs.puppetlabs.com - Dokumentacija za lutke
  • http://docs.puppetlabs.com/guides/language_tutorial.html - Puni opis Jezik lutaka
  • http://docs.puppetlabs.com/references/stable/type.html - Vrste resursa

Kada je broj servera kojima upravljate manji od deset, rijetko ko razmišlja o njihovom centraliziranom upravljanju, to možda neće biti potrebno. Kada postoje desetine servera, centralizovano upravljanje softverom i konfiguracijom je izuzetno korisno. Kada postoje stotine i hiljade servera, to je od vitalnog značaja. Postoji mnogo ovakvih programa, na primjer: Chef, CFEngine, Puppet... Upravo o ovom posljednjem će biti riječi u ovom postu.

Lutka se zasluženo smatra jednom od najbolja rješenja tako. Koriste ga kompanije kao što su Google, Citrix i Red Hat. Ovo je klijent-server aplikacija napisana u programskom jeziku Ruby, koja se distribuira u dvije verzije:

  • Puppet Open Source - potpuno besplatna verzija
  • Puppet Enterprise - besplatno za do 10 servera, tada su potrebne licence

Razmotrimo instalaciju Puppet Open Source servera i agenta, koji su uključeni u pakete najsavremenijih distribucija. Zatim ćemo govoriti o Ubuntu 12.04 Precise Pangolin.

Zadnji kraj Puppet-a se zove puppetmaster, počnimo instalaciju odatle:

:~# apt-get install puppetmaster

A sada klijent:

:~# apt-get install marioneta

U datoteci konfiguracije klijenta /etc/puppet/puppet.conf morate razgovarati o serveru dodavanjem sljedećeg odjeljka:

Server=puppet.local report=true pluginsync=false

U početnoj fazi, bolje je isključiti pluginsync.

Pokrenimo klijenta lutke tako da kreira zahtjev za certifikat:

:~# puppetd --verbose --test info: Kreiranje novog SSL ključa za linux.local info: Keširanje certifikata za ca info: Kreiranje novog zahtjeva za SSL certifikat za linux.local info: Zahtjev za certifikatom otisak prsta (md5): E5: EA:AC:5B:22:9A:BA:42:B8:A1:63:9E:1F:1F:23:51 Izlazak; certifikat nije pronađen i waitforcert je onemogućen

Na serveru morate provjeriti da li je zahtjev za certifikatom primljen i, ako jeste, izdati certifikat:

:~# puppetca --list "linux.local" (E5:EA:AC:5B:22:9A:BA:42:B8:A1:63:9E:1F:1F:23:51) :~# puppetca - -potpišite linux.local obavijest: Potpisani zahtjev za certifikat za linux.local obavijest: Uklanjanje datoteke Puppet::SSL::CertificateRequest linux.local na "/var/lib/puppet/ssl/ca/requests/linux.local.pem"

Ponovite prethodni korak na klijentu:

:~# puppetd --verbose --test info: Keširanje certifikata za linux.local info: Preuzimanje informacija o dodatku: Keširanje certificate_revocation_list za ca info: Keširanje kataloga za linux.local info: Primjena konfiguracijske verzije "1356278451" info: Kreiranje datoteke stanja / var/lib/puppet/state/state.yaml obavijest: Završen katalog pokrenut za 0,02 sekunde

Odlično, sve radi. Pređimo na kreiranje prvog manifesta. Manifesti, ili konfiguracije, opisani su posebnim deklarativnim jezikom. Odmah ćemo se naviknuti na dobre stvari, koristiti modularnu strukturu i časove. Na primjer, napišimo modul koji će održavati datoteku ažurnom /etc/hosts na svim našim serverima.

Provjerimo gdje lutka traži module:

:~# puppet apply --configprint modulepath /etc/puppet/modules:/usr/share/puppet/modules

Kreirajte direktorije za svoj modul

:~# cd /etc/puppet/modules :~# mkdir hosts; cd hostovi; mkdir manifesti; cd manifesti

Prvi manifest, poznat i kao datoteka glavnog modula, treba pozvati init.pp

Hostovi klase ( # puppet.local host ( "puppet.local": osigura => "prisutno", target => "/etc/hosts", ip => "192.168.0.1", host_aliases => "puppet", ) # linux.local host ("linux.local": osigurati => "prisutan", target => "/etc/hosts", ip => "192.168.0.2", host_aliases => "linux", ) )

Po defaultu, lutka traži datoteku /etc/puppet/manifests/site.pp da učitate konfiguraciju, dovedite je u sljedeći oblik:

Zadani čvor (uključujući hostove)

Provjeravamo manifest na serveru:

:~# puppet apply --verbose /etc/puppet/manifests/site.pp info: Primjena verzije konfiguracije "1356281036" obavijest: /Stage//Host/ensure: kreirana informacija: FileBucket dodavanje (md5)obavijest: /Stage// Host/osiguranje: kreirana obavijest: Završeno izvođenje kataloga za 0,03 sekunde

Na klijentu:

:~# ll /etc/hosts rw-r--r-- 1 root root 290, 16. decembar 19:10 /etc/hosts :~# puppetd --verbose --test info: Keširanje kataloga za linux.local info: Primjena konfiguraciona verzija "1356283380" info: FileBucket dodavanje (md5)obavijest: /Stage/Hosts/Host/ensure: kreirana obavijest: /Stage/Hosts/Host/ensure: kreirana obavijest: Završen katalog pokrenut za 0,04 sekunde :~# ll /etc /hosts -rw-r--r-- 1 root root 551 23. prosinca 20:43 /etc/hosts

Nakon što smo sigurni da sve radi, dozvoljavamo servisu da počne /etc/default/puppet promjena:

# Pokrenuti lutku pri pokretanju? START=da

Pokretanje usluge

:~# servis lutke start

Puppet će ispitivati ​​server puppetmaster svakih 30 minuta za promjene konfiguracije i, ako je potrebno, prilagoditi sistem u skladu s tim.

Prije nekog vremena, lista servera u mojim oznakama premašila je 200. Kako se broj servera povećava, postavljanje bilo koje nove konfiguracije ili instaliranje novih paketa gubi ogromnu količinu vremena. Zato sam odlučio da koristim lutku.
Lutka(engleski puppet) je multi-platformska klijent-server aplikacija koja vam omogućava da centralno upravljate konfiguracijom operativnih sistema i programa instaliranih na nekoliko računara. Puppet je napisan u programskom jeziku Ruby.

Kažu i da je puppet sistem za daljinsko upravljanje konfiguracijom, čiji su najpoznatiji predstavnici otvoreni sistemi Cfengine i Puppet.

Nakon što sam pročitao recenzije, odlučio sam koristiti lutku.

Instalacija i konfiguracija lutkarskog servera:
Instaliranje lutkarskog servera:
Instalirajte puppet-server na OpenSuSE 11.4:

patent zatvarač u lutkar-serveru

Promijenimo ime servera u marionetski:
/etc/HOSTNAME:

DNS zapis se mora riješiti na 127.0.0.2
mačka /etc/hosts:

127.0.0.2 puppet.site lutka

Dajmo korisniku prava lutka:

Pokrenimo uslugu Puppet Master:

rcpuppetmasterd start

Dodajmo pokretanje lutkarskog demona startupu:

chkconfig -a puppetmasterd

Postavljanje lutkarskog servera:
Hajde da definišemo direktorijum u kome će se čuvati fajlovi koje će server lutke preneti na klijentske mašine u manifestima tipa datoteke.

vim /etc/puppet/fileserver


putanja /etc/puppet/files
dozvoliti *

mkdir /etc/puppet/files

chown -R puppet:puppet /etc/puppet/files

Napravit ćemo datoteku bilo kojeg sadržaja za implementaciju i testiranje na klijentima

dodirnite /etc/puppet/files/puppettesting

Ponovo pokrenimo marionetski server:

rcpuppetmasterd restart

Lutka koristi svoj jezik za opisivanje konačnog stanja operativnog sistema, uz pomoć kojeg administrator sistema ukazuje u koji oblik komponente OS-a treba dovesti da bi on postigao željeno stanje. Stanje može značiti prisustvo određene datoteke, mape, pokrenutih usluga, instaliranih paketa, ažuriranja i još mnogo toga. Sve postavke stanja su opisane u datotekama ili manifestima, koji se nalaze u direktoriju: /etc/puppet/manifests. Ove datoteke imaju imena poput *.pp.

Kreirajmo najjednostavnije manifest:
/etc/puppet/manifests/1.file.pp:

file("/tmp/puppettetesting":
izvor => "puppet:///files/puppettesting",
}

Da biste koristili ovaj manifest:
puppet apply 1.file.pp

Instalacija i konfiguracija klijenta lutke:

patent zatvarač u lutki

Damo korisniku prava lutke:

chown -R puppet.puppet /var/lib/puppet/

Da bi uspostavio vezu sa serverom lutke, marionetski klijent šalje zahtev za potvrdu sertifikata nakon što je ovaj zahtev potvrđen na serveru, lutkarski klijent će početi da koristi manifeste koji su mu namenjeni. Poslat ćemo zahtjev za potvrdu certifikata:

Na serveru možemo vidjeti koji su zahtjevi za potvrdu na čekanju:

"puppet-client.localdomain" (B5:12 :69 :63 :DE:19 :E9:75 :32 :2B:AA:74 :06:F6:8E:8A)

Potvrđujemo:

puppetca --znak "puppet-client.localdomain"

Vrijeme je da pogledamo najjednostavnije primjere kreiranja manifesta:
kreirajte datoteku /etc/puppet/manifests/site.pp:

zadani čvor (
file("/tmp/puppettetesting":
izvor => "puppet:///files/puppettesting",
}
usluga("ntp":
osigurati => trčanje,
omogući => tačno ,
}
paket("htop":
osigurati => instaliran,
}
}

default - primjenjuje se na sve klijente
datoteka - ovaj odjeljak kaže da kreirate ili prepišete /tmp/puppettetesting datoteku koja se nalazi na serveru u direktoriju /etc/puppet/files
usluga: provjerite da li je servis pokrenut, ako ne radi, onda ga pokrenite, a također ga dodajte u pokretanje
paket: provjerite da li je htop paket instaliran na klijentu i ako nije, instalirajte ga.

Da provjerite, pokrenite na klijentu:

Kao što vidite, na klijentu je ntp dodan u startup, pokrenut je ntp demon, instaliran je htop paket, a datoteka puppettetesting je kopirana u /tmp/ direktorij

info: Katalog za keširanje za puppet-client.localdomain
info: Primjena verzije konfiguracije "1370163660"
obavijest: / Stage[ main] // Node[ default] / Service[ ntp] / osigurati: osigurati da je promijenjeno "zaustavljeno" u "pokrenuto"
obavijest: / Stage[ main] // Čvor[ default] / Package[ htop ] / osigurati: kreirano
obavijest: / Stage[ main] // Node[ default] / File[ / tmp/ puppettesting] / osigurati: definiran sadržaj kao "(md5)f2171ac69ba86781bea2b7c95d1c8e67"
napomena: Završen katalog za 3,95 sekundi

U sljedećem članku ću opisati složenije primjere kreiranja manifesta i web sučelja lutkarske ploče.

Popularne vrste resursa za lutke
cron- upravljanje cron poslovima
exec- pokretanje skripti i komandi
fajl- upravljanje fajlovima
filebucket- sigurnosna kopija datoteke
grupa- upravljanje grupom
domaćin- upravljanje unosima u /etc/hosts fajlu
interfejs- konfiguracija mrežnih interfejsa
mount- montiranje sistema datoteka
obavijestiti- slanje poruke u datoteku dnevnika Puppet
paket- upravljanje paketima
usluga- upravljanje uslugama
sshkey- SSH upravljanje ključevima
uredno- brisanje fajlova u zavisnosti od uslova
korisnik- upravljanje korisnicima
zone- Upravljanje zonom Solaris


Malo poezije.Čini se da bi ovaj članak trebao biti polazna tačka za čitav niz, ali ciljna publika su ipak iskusniji korisnici Open Source Puppet Labs proizvoda koji nisu zadovoljni pojedinačnim, slabo integriranim modulima s Puppet Forgeom. Kao iu svakom slučaju „biblioteka protiv okvira“, cena koju treba platiti je praćenje pogleda na svet autora integrisanog rešenja.

Malo o tome kako Puppet funkcionira

Puppet je prvenstveno specifičan jezik za deklarativno određivanje konačnog stanja sistema. Poređenja radi, izuzetno je prikladan GNU Makefile, gdje je, pored direktnog opisa ovisnosti, moguće začuditi do kraja.

Lutkarska apstrakcija je otprilike ovako ( razbijanje obrazaca - zaboravite sve što ste znali o terminima programiranja!).

  • Čvor je skup konfiguracija za određeni ciljni sistem. U stvari, ovo je poseban slučaj klase.
  • Klasa je skup deklarativne logike koja je uključena u konfiguraciju čvora ili druge klase. Klasa nema ni instance ni metode, ali ima parametre i varijable definirane unutar logike. U stvari, to je prije procedura koja može naslijediti drugu proceduru jednostavnim dodavanjem koda i ne tako banalnim opsegom varijabli.
  • Tip- ali ovo više liči na klasičnu klasu - pretpostavlja instance s imenom i definitivno specificiranim parametrima, ali ništa više. Specifična implementacija tipa može biti napisana kao skripta Puppet preko define , koja kreira instance drugih tipova, ili kao Ruby ekstenzija sa velikom maštom.
  • Resurs- ovo su zapravo imenovane instance tipova. Svako ime resursa je jedinstveno unutar određenog tipa unutar konfiguracije čvora (direktorija).
  • Varijable- pa, ukratko, to su konstante... Prije Puppet 4 stvari su bile još gore s njihovim opsegom. Sada je to adekvatno: za upotrebu izvan lokacije definicije, mora biti specificiran potpuno kvalificirani identifikator, osim u slučaju nasljeđivanja klase.
Puppet se može koristiti za lokalnu implementaciju bez mreže ili povezane infrastrukture. Ovo se može koristiti za kreiranje slika kontejnera. Postoji čak i cijeli pokret koji zagovara napuštanje centraliziranog servera.

Na ideološki ispravan način, infrastruktura lutke sastoji se od agenta – privilegovanog servisa na ciljnom sistemu – i servera koji distribuira vrijedne instrukcije u obliku deklarativnih direktorija resursa na zahtjev agenata. Sigurnost je implementirana na nivou infrastrukture privatnog javnog ključa (X.509). Jednostavno rečeno, isti mehanizmi kao u HTTPS-u, ali sa vlastitim CA i obaveznom verifikacijom certifikata klijenta.

U pojednostavljenom obliku, postupak postavljanja izgleda otprilike ovako:

  1. Obrada putem TLS-a i X.509 (uspostavljanje veze, ažuriranje CRL-a, provjera ograničenja certifikata, itd.)
  2. Agent prima generatore činjenica sa servera sa keširanjem i svim ostalim stvarima (tačnije, sve se povlači iz lib/ foldera u modulima). Nije teško dodati vlastitu Ruby skriptu za prikupljanje informacija od interesa.
  3. Agent prikuplja činjenice o ciljnom sistemu i šalje ih serveru. Sve činjenice se mogu lako pregledati ručno putem poziva na lutke. Ove činjenice su dostupne kao globalne varijable.
  4. Server sastavlja katalog resursa i šalje ga agentu. Ispod toga leži čitav sloj različitih koncepata.
  5. Agent povlači sve što je potrebno sa servera i dovodi sistem u specificiranu formu. Agent sam ne zna šta da radi sa resursima, on se oslanja na implementaciju provajdera (semantički prevod će biti „implementar“, a ne dobavljač) određenih vrsta resursa, dok su neki provajderi uključeni u pakete ostali su izvučeni iz modula.
Za uživanje u svim užicima tu su i dodatne lepinje u obliku:
  • Modul- kolekcija deklarativnih skripti Puppet, Ruby ekstenzija za Puppet, datoteka, predložaka datoteka, Hiera podataka i još mnogo toga. Ispravniji izraz bi bio "paket".
  • Životna sredina- skup skripti, modula i Hiera podataka. Kako je infrastruktura postala složenija, neizbježno je postalo neophodno podijeliti konfiguraciju dalje od standardne podjele po čvorovima. U osnovi, ovo je potrebno za pilot inovacije i banalnu kontrolu pristupa (kada svi administratori nemaju pristup svim čvorovima IT infrastrukture).
  • Hiera- hijerarhijska baza podataka. Ova formulacija može biti vrlo zastrašujuća. To je vjerovatno razlog zašto je promijenjen u dokumentaciji kasnijih verzija. Zapravo, ovo je izuzetno jednostavan i zgodan mehanizam za izvlačenje konfiguracije iz YAML ili JSON datoteka. Hijerarhija je mogućnost specificiranja redoslijeda čitanja više konfiguracijskih datoteka – tj. hijerarhiju/prioritet ovih datoteka.
    • Pored izvlačenja podataka o pozivima funkcija, Puppet povlači zadane parametre klase, što je glavni vrhunac.
    • Naravno, Hiera podržava interpolaciju činjenica, pa čak i pozivanje posebnih funkcija.
    • U Puppet 4.3 ponovo smo implementirali istu funkcionalnost kako bismo podržali ne samo globalnu bazu podataka, već i lokalnu za okruženje i modul, iako je autor već pronašao nekoliko problema u njihovoj implementaciji (PUP-5983, PUP-5952 i PUP -5899), koje je Puppet Labs odmah popravio.
    • Podržano je nekoliko strategija za izdvajanje vrijednosti iz svih datoteka u hijerarhiji:
      • first - vraća se prva vrijednost pronađena po prioritetu
      • jedinstveno - prikuplja sve vrijednosti u jednodimenzionalni niz i uklanja duplikate
      • hash - kombinuje sve pronađene YAML Hash. Duplikati ključeva se biraju po prioritetu.
      • deep je u suštini rekurzivna verzija heša
    • Ljepota je u tome što se strategija uzorkovanja može postaviti bilo pozivanjem funkcije lookup(), jer iu bilo kojoj hijerarhijskoj datoteci preko posebnog ključa lookup_options, koji se aktivno koristi u modulu cfnetwork.
  • PuppetDB- u suštini sloj poslovne logike oko relacione baze podataka (PostgreSQL), koji vam omogućava da sačuvate izveštaje o činjenicama i izvršenim implementacijama i izvezete resurse za naknadni uvoz u direktorijume na drugim čvorovima ili odabir putem posebnih funkcija. Tu je i web interfejs u obliku Puppet Dashboard.
  • X.509 PKI- već spomenuta infrastruktura certifikata, koja je izuzetno pogodna za korištenje za druge servise bez potrebe upravljanja posebnom infrastrukturom.
  • MCollective- izgleda korisna stvar za pokretanje zadataka na farmi servera zasnovano na događajima, ali autor ima određeno nepovjerenje u sigurnost određenog rješenja.
  • Puppet Forge- otvorena platforma za objavljivanje i preuzimanje modula.
  • neke druge karakteristike u obliku kontrola eksternih uređaja kao što je Cisco oprema i implementacija na goli metal, ali to je druga priča

Napomene o sigurnosti i pristupačnosti

Morate shvatiti da Puppet Server postaje ranjiva tačka cjelokupne IT infrastrukture, jer... određuje konačnu konfiguraciju svih sistema. U posebnim slučajevima, ima smisla napraviti razdvajanje - poseban server za kritične infrastrukturne elemente sa ekstremno ograničen pristup I ručno ažuriranje a drugi za sve ostalo.

Dostupnost Puppet Servera određuje mogućnost upravljanja cjelokupnom infrastrukturom. Ima smisla hostirati Puppet Server na virtuelnoj mašini u pouzdanijem i brzo oporavljivom oblaku treće strane od sopstvene sposobnosti. Ili biste trebali instalirati nekoliko servera.

U svakom slučaju, ne biste trebali instalirati druge servise na sistem na kojem će biti postavljen Puppet Server sa zvonima i zviždaljkama. Virtuelizacija i kontejnerizacija vam mogu pomoći.

Multi-master (nekoliko zasebnih servera za lutke)

  • IN u ovom slučaju samo jedan server djeluje kao CA (Certificate Authority) - njegova nedostupnost znači da je nemoguće dodati nove čvorove.
    • Puppet vam omogućava da koristite X.509 infrastrukturu treće strane ako ona nije zadovoljavajuća.
  • Cijela konfiguracija (okruženje) mora biti pohranjena u sistemu za kontrolu verzija i raspoređena na svaki server istovremeno.
  • Jedina zajednička stvar je PostgreSQL baza podataka, čija je organizacija visoke dostupnosti izvan okvira ovog članka.
  • Modul cfpuppetserver podržava i primarne (sa CA) i sekundarne serverske instalacije.

Što se značajno promijenilo od starijih verzija

Proizvođač ima potpuni opis.
  • Svi servisi su premješteni na JVM, JRuby i Jetty. Uprkos očiglednim prednostima integracije, postoje i nedostaci u smislu potrošnje memorije.
  • Lambda funkcije su dodane za obradu kolekcija - sada nema potrebe rezati štake u Ruby-u ili pervertirati putem create_resources()
  • Pojavio se alat za obradu EPP šablona - u suštini isti ERB, ali sa Puppet DSL umesto Ruby,
  • Zadana struktura direktorija konfiguracijskih datoteka se značajno promijenila
  • Dodata podrška za dobavljače podataka za okruženja i module (hakovi više nisu potrebni).
  • Umanjivanje uloge globalne Hiere. Nova i srodna komanda je traženje lutke.

Instalacija

Ovaj proces je prilično primitivan, ali zahtijeva praćenje određenog niza koraka. Pošto je ovo ručno raditi nezahvalan zadatak, autor će vas naučiti nečemu lošem, odnosno preuzimanju nerazumljivih skripti sa interneta i pokretanju kao root na vašem sistemu.

Tri glavne komponente servera su sam Puppet Server, PuppetDB i PostgreSQL. Svi oni mogu biti zbijeni u jedan čvor ili podijeljeni u dva ili tri sistema. Puppet Server i Puppet DB mogu se pokrenuti više puta, ali PostgeSQL je jedna tačka kvara. Postoje različiti pristupi PostgeSQL replikaciji i grupisanju u klastere. Pogodan pristup u slučaju glavnog i sekundarnog servera bi bio Master + Read-Only Slave, koji je podržan u samom PuppetDB-u kao glavni čvor baze podataka samo za čitanje, ali automatizuje takve. za podešavanje je potrebno vrijeme i stoga još nije dostupno uključeno u modul cfpuppetserver.

Sama konfiguracija se jednostavno može pohraniti barem na sistem datoteka zajedno sa Puppet Serverom, ali to je kao pisanje skripti na proizvodnom web serveru. Najprikladnije rješenje je git spremište. Uslužni program r10k može povući sve grane spremišta i postaviti ih na Puppet Server kao odvojena okruženja. r10k je prilično loš u povlačenju zavisnosti, tako da se bibliotekar-luppet koristi na vrhu. Vrijedi odmah napomenuti da je glavno kanonsko okruženje lutaka "proizvodnja". Stoga bi konfiguracijsko spremište trebalo koristiti granu koja se zove "proizvodnja" umjesto "master".

Sistemski zahtjevi

Hardver opisuje sam proizvođač. Modul cfpuppetserver trenutno podržava samo Debian Jessie+ i Ubuntu Trusty+.

Konfiguracija u Gitu

Za sam r10k, lokacija spremišta nije bitna - glavna stvar je njegova dostupnost. Na primjer, u svrhu testiranja, spremište bi moglo biti smješteno na istom sistemu i pristupilo mu se putem file://. Dobro mjesto za početak je primjer konfiguracije codingfuture/puppet-exampleenv.
  1. Kloniranje spremišta: git clone https://github.com/codingfuture/puppet-exampleenv my-puppet-conf && cd my-puppet-conf
  2. Postavili smo opće postavke za administratorski pristup koristeći savjete u komentarima:
    • $EDITOR data/common.yaml
  3. Kreirajmo konfiguraciju čvora:
    • $MY_DOMAIN - root naziv domene(npr. example.org)
    • $HOST_NAME - ime hosta klijenta bez domene
    • mkdir podaci/$MY_DOMAIN
    • cp data/example.com/puppet.yaml data/$(MY_DOMAIN)/puppet.yaml
    • $EDITOR nano -w data/$(MY_DOMAIN)/puppet.yaml - postavljanje čvora sa Puppet serverom prema prijedlozima u komentarima
    • cp data/example.com/host.yaml data/$(MY_DOMAIN)/$(HOST_NAME).yaml
    • $EDITOR nano -w data/$(MY_DOMAIN)/$(HOST_NAME).yaml - postavljanje proizvoljnog čvora na osnovu prijedloga u komentarima
  4. Prebacujemo na naš vlastiti Git server ili ga činimo dostupnim lokalno na čvoru s Puppet Serverom putem rsync ili scp-a. Lokalno spremište je zgodno kao međukorak dok se Git server ne postavi iz samog Puppet-a. U određenom smislu, ovo podsjeća na sastavljanje kompajlera u nekoliko faza.

Instalacija od nule na čistom sistemu

Modul cfpuppetserver omogućava vam da instalirate sve koristeći sam Puppet, ali za početnu instalaciju osnovne operacije dupliciran Bash skriptom.

Na ciljnom sistemu:

  1. Preuzmite instalacijsku skriptu: wget https://raw.githubusercontent.com/codingfuture/puppet-cfpuppetserver/master/setup_puppetserver.sh
  2. Gledamo kroz skriptu i mrštimo se: manje setup_puppetserver.sh
  3. Pokrenite: bash setup_puppetserver.sh marioneta.$(MY_DOMAIN) .
    • Primjer sa udaljenim spremištem: bash setup_puppetserver.sh ssh:// [email protected]/puppet-conf
    • Primjer sa lokalnim: bash setup_puppetserver.sh file:///root/puppetconf/
  4. Vidimo kako se sistem nadima i ne instalira sve vrlo brzo.
  5. Ako je spremište udaljeno:
    • Kreirajte SSH ključ za root: ssh-keygen -t rsa -b 2048
    • Registriramo javni ključ /root/.ssh/id_rsa.pub na udaljenom Git serveru...
    • ... i postavite Git zakačicu tamo pozivajući sljedeću naredbu: /usr/bin/ssh -T deploypuppet@puppet.$(MY_DOMAIN) ./puppetdeploy.sh
  6. Počinjemo sa implementacijom konfiguracije ručno: /etc/puppetlabs/deploy.sh
  7. Hajde da probamo kako to radi na samom serveru: /opt/puppetlabs/bin/puppet agent --test
  8. Provjerite postavke mreže, mrežnog filtera i SSH pristupa

Dodavanje upravljanih čvorova

  1. Potpuno kvalificirano ime Puppet servera mora biti dostupno preko DNS-a na upravljanom hostu ili tvrdo kodirano u /etc/hosts.
    • Primjer: echo "128.1.1.1 puppet.example.com" >> /etc/hosts
  2. Na čvoru sa serverom Puppet, pokrenite sljedeću skriptu /root/genclientinit.sh $(HOST_NAME).$(MY_DOMAIN) .
  3. Kopirajte cijeli rezultat i zalijepite ga u komandnu liniju na ciljnom sistemu.
  4. Čekamo kraj izvršenja i pokrećemo /opt/puppetlabs/bin/puppet agent --test. Prilikom prvog pokretanja, generirat će se zahtjev za potpisivanje certifikata.
  5. Idemo do čvora Puppet Server da potpišemo certifikat.
    • lutkarska lista certifikata - provjeravamo potpis certifikata za dodatnu paranoju.
    • marionetski certifikat $(HOST_NAME).$(MY_DOMAIN) - zapravo, potpisujemo certifikat.
  6. Vraćamo se na upravljani čvor i ponovo pokrećemo: /opt/puppetlabs/bin/puppet agent --test`. Ovo će prisiliti da započne postupak raspoređivanja.
  7. Čekamo da se implementacija završi preko Puppet Agenta.
  8. To je to, imate spremnu minimalnu infrastrukturu za lutke!

Primjer izlaza iz /root/genclientinit.sh

bash</etc/cflocation fi if test ! -z ""; zatim echo -n >/etc/cflocationpool fi ako test ! -z "\$http_proxy"; zatim izvoz http_proxy izvoz https_proxy="\$http_proxy" izvoz HTTP_PROXY="\$http_proxy" izvoz HTTPS_PROXY="\$http_proxy" fi echo host.example.com > /etc/ime hosta ime hosta host.example.com ako ! koji lsb-release | read; zatim apt-get install lsb-release fi codename=\$(lsb_release -cs) if test -z "\$codename"; zatim echo "Neuspjelo otkrivanje ispravnog kodnog imena" izlaz 1 fi wget https://apt.puppetlabs.com/puppetlabs-release-pc1-\$(codename).deb dpkg -i puppetlabs-release-pc1-\$(codename) .deb mkdir -p /etc/puppetlabs/puppet cat > /etc/puppetlabs/puppet/puppet.conf<lutka cert znak host.example.com" echo "Koristite CTRL+C da zaustavite ciklus, ako ne uspije iz različitih razloga" spavanje 5 urađeno EOT

Opis modula

Kompletna lista Bash parametara početne instalacione skripte

~# ./setup_puppetserver.sh Upotreba: ./setup_puppetserver.sh [ [ [ [] ] ] ]
  • r10k_repo_url - URI Git spremišta
  • certname - potpuno kvalificirano ime domene hosta
  • cflocation - inicijalizacija činjenice cf_location
  • cflocationpool - inicijalizacija činjenice cf_location_pool
  • http_proxy - proxy server za HTTP i HTTPS zahtjeve

Kompletna lista Bash parametara za init skriptu klijenta Puppet

~# /root/genclientinit.sh Upotreba: ./genclientinit.sh [ [ []]]
Značenje parametara je isto kao u prethodnoj skripti.

cfpuppetserver class

  • deployuser = "deploypuppet" - korisničko ime za automatsko postavljanje ažuriranja konfiguracije
  • deployuser_auth_keys = undef - lista ključeva za $deployuser
  • repo_url = undef - URI spremišta (primjer: ssh://user@host/repo ili file:///some/path)
  • puppetserver = true - da li instalirati komponentu Puppet Server na ovom čvoru
  • puppetdb = true - da li instalirati komponentu PuppetDB na ovaj čvor
  • puppetdb_port = 8081 - port za PuppetDB
  • setup_postgresql = true - da li instalirati PostgreSQL komponentu na ovaj čvor (samo ako je omogućena instalacija PuppetDB)
  • service_face = "bilo koji" - naziv cfnetwork::iface resursa za prihvatanje dolaznih veza
  • puppetserver_mem = auto - RAM za Puppet Server u megabajtima (minimalno 192MB)
  • puppetdb_mem = auto - RAM za PuppetDB u megabajtima (minimalno 192MB)
  • postgresql_mem = auto - RAM za PostgreSQL u megabajtima (minimalno 128MB)

klasa cfpuppetserver::puppetdb

  • postgresql_host = "localhost" - adresa baze podataka
  • postgresql_listen = $postgresql_host - vrijednost ide direktno u listen_addresses PostgreSQL direktivu
  • postgresql_port = 5432 - port baze podataka
  • postgresql_user = "puppetdb" - PuppetDB korisnik u bazi podataka
  • postgresql_pass = "puppetdb" - lozinka korisnika PuppetDB u bazi podataka
  • postgresql_ssl = false - omogući šifriranje veze na osnovu Puppet PKI certifikata

klasa cfpuppetserver::puppetserver

  • autosign = false - NE TREBA se koristiti u borbenom okruženju, osim možda u DMZ-u. Postoji isključivo za automatizaciju testiranja.
  • global_hiera_config = "cfpuppetserver/hiera.yaml" - put do zadane Hiera konfiguracijske datoteke prema kanonima Puppet (prva komponenta je naziv modula, ostatak je putanja ispod datoteka/fascikla u modulu)

Možete pomoći i prenijeti neka sredstva za razvoj stranice



Sergey Yaremchuk

Centralizirana konfiguracija UNIX sistema koristeći Puppet

Upravljanje velikim brojem UNIX sistema ne može se nazvati zgodnim. Da bi promijenio jedan parametar, administrator mora kontaktirati svaku mašinu, skripte mogu samo djelomično pomoći, a ne u svim situacijama.

Treba imati na umu da su Windows mrežni administratori još uvijek u povoljnijoj poziciji. Dovoljno je promijeniti postavke grupne politike i nakon nekog vremena svi računari na mreži, uključujući i one sa nedavno instaliranim operativnim sistemom, "saznaju" za inovaciju, ako se njih tiče, naravno. Gledajući unazad kroz dugi period razvoja UNIX-a, možete vidjeti da se ništa slično ovome nikada nije uhvatilo. Postoje rješenja kao što je kickstart koja pomažu pri početnoj instalaciji operativnog sistema, ali dalji razvoj će zahtijevati značajan napor. Komercijalna rješenja, poput BladeLogic-a i OpsWare-a, samo djelimično rješavaju problem automatizacije postavki, njihova glavna prednost je prisustvo grafičkog sučelja i samo velike organizacije mogu sebi priuštiti kupovinu. Postoje, naravno, projekti koji nude besplatna rješenja, ali za cijelo vrijeme postojanja nisu uspjeli stvoriti veliku zajednicu. Na primjer, Cfengine nije jako popularan među administratorima, iako se, osim u Linuxu, može koristiti u *BSD, Windows i Mac OS X. To može biti zbog relativne složenosti kreiranja konfiguracija. Prilikom opisivanja zadataka potrebno je uzeti u obzir karakteristike svakog konkretnog sistema i ručno kontrolisati redosled radnji prilikom izvršavanja naredbi. To jest, administrator mora zapamtiti da za neke sisteme treba napisati adduser, za druge - useradd, uzeti u obzir lokaciju datoteka na različitim sistemima, itd. Ovo komplikuje proces pisanja naredbi za red veličine, vrlo je teško kreirati ispravnu konfiguraciju u hodu, a gotovo je nemoguće pročitati kreirane konfiguracije nakon nekog vremena. Uprkos GPL licenci, Cfengine je u suštini projekat jednog čoveka koji kontroliše sve promene i nije baš zainteresovan za izgradnju otvorenog društva. Kao rezultat toga, mogućnosti Cfengine-a su sasvim zadovoljavajuće za programera, ali za druge administratore to predstavlja dodatnu glavobolju. Da bi se poboljšao Cfengine, razni dodaci su kreirani od strane programera trećih strana, što je često samo pogoršavalo situaciju. Autor nekoliko takvih modula za Cfengine, Luke Kanies, na kraju je odlučio da razvije sličan alat, ali bez mnogih nedostataka Cfenginea.

Puppet Features

Puppet, kao i Cfengine, je sistem klijent-server koji koristi deklarativni jezik da opiše zadatke i biblioteke za njihovu implementaciju. Klijenti se periodično (podrazumevano svakih 30 minuta) povezuju na centralni server i dobijaju najnoviju konfiguraciju. Ukoliko primljena podešavanja ne odgovaraju stanju sistema, biće izvršena, a po potrebi će serveru biti poslat izveštaj o izvršenim operacijama. Server za poruke može je sačuvati u syslog ili datoteku, kreirati RRD graf i poslati ga na navedenu e-poštu. Dodatni slojevi apstrakcije transakcija i resursa pružaju maksimalnu kompatibilnost sa postojećim postavkama i aplikacijama, omogućavajući vam da se fokusirate na sistemske objekte bez brige o razlikama u implementaciji i opisu detaljnih komandi i formata datoteka. Administrator radi samo sa tipom objekta, za ostalo se brine Puppet. Dakle, tip paketa zna za 17 sistemskih paketa koji će biti automatski prepoznat na osnovu informacija o verziji distribucije ili sistema, iako, ako je potrebno, menadžer paketa se može podesiti nasilno.

Za razliku od skripti, koje je često nemoguće koristiti na drugim sistemima, konfiguracije lutke koje su napisali administratori treće strane će raditi na bilo kojoj drugoj mreži uglavnom bez problema. Puppet CookBook već ima tri desetine gotovih recepata. Puppet trenutno službeno podržava sljedeće operativne sustave i usluge: Debian, RedHat/Fedora, Solaris, SUSE, CentOS, Mac OS X, OpenBSD, Gentoo i MySQL, LDAP.

Jezik lutaka

Da biste krenuli naprijed, prvo morate razumjeti osnovne elemente i mogućnosti jezika. Jezik je jedna od jakih strana lutke. Opisuje resurse kojima administrator planira da upravlja i radnje. Za razliku od većine sličnih rješenja, Puppet omogućava jeziku da pojednostavi pristup svim sličnim resursima na bilo kojem sistemu u heterogenom okruženju. Opis resursa se obično sastoji od imena, tipa i atributa. Na primjer, pokažimo na datoteku /etc/passwd i postavimo njene atribute:

fajl("/etc/passwd":

Vlasnik => root,

Grupa => root,

Mod => 644,

Sada će klijenti koji se povezuju na server kopirati datoteku /etc/passwd i postaviti specificirane atribute. Možete definirati više resursa u jednom pravilu, odvajajući ih tačkom i zarezom. Ali šta ako se konfiguraciona datoteka koja se koristi na serveru razlikuje od klijentske ili se uopšte ne koristi? Na primjer, ova situacija može nastati prilikom postavljanja VPN veza. U ovom slučaju, trebali biste pokazati na datoteku koristeći izvornu direktivu. Ovdje postoje dvije opcije, kao i obično, možete odrediti putanju do druge datoteke, kao i korištenje dva podržana URI protokola: fajl i lutka. U prvom slučaju, koristi se veza sa eksternim NFS serverom, u drugoj opciji, na serveru Puppet se pokreće NFS servis koji izvozi resurse. U potonjem slučaju, zadana staza je relativna u odnosu na korijenski direktorij lutke – /etc/puppet. Odnosno, veza puppet://server.domain.com/config/sshd_config će odgovarati datoteci /etc/puppet/config/sshd_config. Možete nadjačati ovaj direktorij koristeći filebucket direktivu, iako je ispravnije koristiti odjeljak istog imena u /etc/puppet/fileserver.conf datoteci. U tom slučaju možete ograničiti pristup servisu samo na određene adrese. Na primjer, hajde da opišemo odjeljak za konfiguraciju:

Putanja /var/puppet/config

Dozvoli *.domain.com

Dozvoli 127.0.0.1

Dozvoli 192.168.0.*

Dozvoli 192.168.1.0/24

Odbij *.wireless.domain.com

A onda se pozivamo na ovaj odjeljak kada opisujemo resurs:

izvor => "puppet://server.domain.com/config/sshd_config"

Ispred dvotočka je naziv resursa. U većini jednostavnim slučajevima Možete jednostavno odrediti punu putanju do datoteke kao ime. U složenijim konfiguracijama bolje je koristiti pseudonim ili varijable. Alias ​​se postavlja pomoću alias direktive:

fajl("/etc/passwd":

Alias ​​=> passwd

Druga opcija za kreiranje pseudonima je dobra kada imate posla sa različitim operativnim sistemima. Na primjer, napravimo resurs koji opisuje datoteku sshd_config:

fajl (sshdconfig:

Ime => $operatingsystem ? (

Solaris => "/usr/local/etc/ssh/sshd_config",

Zadano => "/etc/ssh/sshd_config"

U ovom primjeru, mi smo suočeni sa izborom. Fajl za Solaris je specificiran posebno, za sve ostale će biti odabran fajl /etc/ssh/sshd_config. Sada se ovom resursu može pristupiti kao sshdconfig, ovisno o operativnom sistemu, željena putanja će biti odabrana. Na primjer, istaknemo da ako sshd demon radi i prima novi fajl, trebali biste ponovo pokrenuti uslugu:

usluga (sshd:

Osigurati => istina,

Pretplati se => Fajl

Varijable se često koriste pri radu s korisničkim podacima. Na primjer, opisujemo lokaciju korisničkih kućnih direktorija:

$homeroot = "/home"

Sada se datotekama određenog korisnika može pristupiti kao:

$(homeroot)/$name

Parametar $name će biti popunjen imenom korisničkog naloga. U nekim slučajevima je zgodno definirati zadanu vrijednost za neki tip. Na primjer, za tip exec vrlo je uobičajeno specificirati direktorije u kojima treba tražiti izvršnu datoteku:

Exec (put => "/usr/bin:/bin:/usr/sbin:/sbin")

Ako trebate pokazati na nekoliko ugniježđenih datoteka i direktorija, možete koristiti parametar recurse:

file("/etc/apache2/conf.d":

Izvor => "puppet:// puppet://server.domain.com/config/apache/conf.d",

Rekurziv => "tačno"

Više resursa može se kombinirati u klase ili definicije. Klase su potpuni opis sistema ili usluge i koriste se zasebno:

klasa linux (

Fajl (

"/etc/passwd": vlasnik => root, grupa => root, mod => 644;

"/etc/shadow": vlasnik => root, grupa => root, mod => 440

Kao iu objektno orijentisanim jezicima, klase se mogu nadjačati. Na primjer, na FreeBSD-u vlasnik grupe ovih datoteka je wheel. Stoga, da ne bismo potpuno prepisali resurs, krenimo nova klasa freebsd, koji će naslijediti linux klasu:

klasa freebsd nasljeđuje linux (

Fajl["/etc/passwd"] ( group => wheel );

Fajl["/etc/shadow"] ( grupa => kotač )

Radi praktičnosti, svi razredi se mogu smjestiti u zaseban fajl, koji mora biti uključen u Direktivu o uključivanju. Definicije mogu uzeti više parametara kao argumente, ali ne podržavaju nasljeđivanje i koriste se kada trebate opisati objekte za višekratnu upotrebu. Na primjer, definirajmo početni direktorij korisnika i naredbe potrebne za kreiranje novog naloga:

definiraj user_homedir ($group, $fullname, $inggroups) (

Korisnik("$name":

Osigurati => prisutan,

Komentar => "$fullname",

Gid => "$group",

grupe => $ingroups,

Članstvo => minimalno,

Shell => "/bin/bash",

Početna => "/home/$name",

Zahtijeva => Grupa[$group],

Exec("$name homedir":

Naredba => "/bin/cp -R /etc/skel /home/$name; /bin/chown -R $name:$group /home/$name",

Kreira => "/home/$name",

Zahtijeva => Korisnik [$name],

Sada da kreiramo novu račun, samo kontaktirajte user_homedir:

user_homedir("sergej":

Grupa => "sergej",

Puno ime => "Sergej Jaremchuk",

Ingroups => ["media", " admin]

Postoje zasebni opisi čvorova koji podržavaju nasljeđivanje, kao i klase. Kada se klijent poveže sa serverom Puppet, biće pretraživan odgovarajući odeljak čvora i biće obezbeđene postavke specifične samo za ovaj računar. Da opišete sve druge sisteme, možete koristiti zadani čvor. Opis svih tipova dat je u dokumentu “Type Reference”, koji se u svakom slučaju mora pročitati, barem da bi se razumjele sve mogućnosti jezika lutke. Razne vrste dozvoliti da nastupate specificirane komande, uključujući kada su ispunjeni određeni uslovi (na primjer, promjena konfiguracijske datoteke), rad sa cron-om, korisničkim akreditivima i grupama, računarima, montiranjem resursa, pokretanjem i zaustavljanjem usluga, instaliranjem, ažuriranjem i uklanjanjem paketa, radom sa SSH ključevima, Solaris zonama i tako dalje. Ovako možete jednostavno natjerati listu paketa u distribucijama koristeći apt da se svakodnevno ažurira između 2 i 4 sata:

raspored (dnevno:

Period => dnevno,

Raspon =>

exec("/usr/bin/apt-get update":

Raspored => dnevno

Ažuriranje za taj period će svaki sistem izvršiti samo jednom, nakon čega se zadatak smatra završenim i biće obrisan sa klijentskog računara. Jezik lutke podržava druge poznate strukture: uslove, funkcije, nizove, komentare i slično.

Instaliranje lutke

Za Puppet je potreban Ruby (verzija 1.8.1 i novija) sa OpenSSL podrškom i XMLRPC bibliotekama, kao i Faster bibliotekom. Ubuntu 7.04 spremište koje je korišteno za probnu instalaciju već uključuje paket puppy:

$ sudo apt-cache marioneta za pretraživanje

~$ ruby ​​-rxmlrpc/client -e "puts:yep"

da

Ako nema grešaka, onda je sve što vam je potrebno već uključeno. Datoteke koje opisuju željenu konfiguraciju sistema nazivaju se manifesti u terminologiji lutke. Kada se pokrene, demon pokušava da pročita datoteku /etc/puppet/manifests/site.pp, ako nedostaje, prikazuje poruku upozorenja. Kada testirate, možete reći demonu da radi u samostalnom načinu rada, koji ne zahtijeva manifest:

$ sudo /usr/bin/puppetmasterd --nonodes

Ako je potrebno, možete povezati druge datoteke na site.pp, na primjer, s opisima klasa. Za probni rad, možete unijeti najjednostavnije upute u ovu datoteku.

klasa sudo (

Fajl("/etc/sudoers":

Vlasnik => root,

Grupa => root,

Mod => 440,

zadani čvor (

Uključi sudo

Sve konfiguracijske datoteke, i server i klijent, nalaze se u /etc/puppet. Datoteka fileserver.conf, o kojoj smo već govorili, je opciona i koristi se samo ako Puppet radi i kao server datoteka. Na Ubuntu-u, ova datoteka izvozi poddirektorij /etc/puppet/files. Ssl poddirektorij sadrži certifikate i ključeve koji će se koristiti za šifriranje prilikom povezivanja klijenata. Ključevi se kreiraju automatski kada prvi put pokrenete puppetmasterd, možete ih ručno kreirati naredbom:

$ sudo /usr/bin/puppetmasterd --mkusers

Datoteke puppetd.conf i puppetmasterd.conf su slične. Oni ukazuju na neke parametre za rad demona na klijentskom sistemu i serveru. Datoteka klijenta se razlikuje samo po prisutnosti parametar servera, pokazujući na kompjuter na kojem radi puppetmasterd:

server = grinder.com

logdir = /var/log/puppet

vardir = /var/lib/puppet

rundir = /var/run

# pošalji izvještaj serveru

izvještaj = istina

Da biste izbjegli ručno kucanje, možete kreirati predložak koristeći sam puppetd:

$ puppetd --genconfig > /etc/puppet/puppetd.conf

Slično, možete kreirati site.pp na serveru:

$ puppetd --genmanifest > /etc/puppet/manifests/site.pp

Druga datoteka, tagmail.conf, omogućava vam da odredite adrese e-pošte na koje će se slati izvještaji. U najjednostavnijem slučaju, možete koristiti jednu liniju:

sve: [email protected]

Konfiguracijski fajlovi nisu dovoljni da se klijent poveže sa serverom. Da biste to učinili, također morate potpisati certifikate.

Prvo, da obavestite server o novom računaru, unesite komandu na klijentskom sistemu:

$ sudo puppetd --server grinder.com --waitforcert 60 –test

Firewall mora dozvoliti veze na portu 8140.

Na serveru dobijamo listu sertifikata koje je potrebno potpisati:

$ sudo puppetca –list

nomad.grinder.com

I potpišite certifikat klijenta:

$ sudo puppetca –sign nomad.grinder.com

Sada se klijent može slobodno povezati na server i primati postavke.

Nažalost, u članku je nemoguće prikazati sve mogućnosti Puppet-a. Ali, kao što vidite, ovo je funkcionalan i fleksibilan alat koji vam omogućava da riješite većinu problema istovremenog upravljanja velikim brojem sistema. I što je najvažnije, projekat je uspio okupiti malu, ali stalno rastuću zajednicu. Stoga, nadajmo se da dobra ideja neće biti dopuštena da umre ili ode po strani.

Sretno!

  1. Web stranica projekta BladeLogic – http://www.bladelogic.com.
  2. Web stranica projekta OpsWare je http://www.opsware.com.
  3. Web stranica projekta Cfengine je http://www.cfengine.org.
  4. Web stranica projekta Puppet je http://reductivelabs.com/projects/puppet.
  5. Kuharica za lutke - http://www.reductivelabs.com/trac/puppet/tagspuppet%2Crecipe.
  6. Brža biblioteka –

© 2024 ermake.ru -- O popravci računara - Informativni portal