Puppet konfigurasjonsverktøy

Puppet konfigurasjonsverktøy

Mon 28 November 2011

Denne siden inneholder litt notater om puppet, hva det er for noe og hva det kan brukes til.

Hva er puppet?

Puppet er et opensource rammeverk / verktøykasse for konfigurasjon og styring av maskinoppsett.

Puppet er basert på Ruby, og kan kjøre som klient / server eller standalone. Vi kan bruke puppet til å konfigurere unix / osx, linux og windows plattformer. F.eks ved førstegangsoppsett, oppgraderinger, vedlikehold eller når hosten skal avvikles (migrering av oppsett / tjenester).

Puppet som modell består av 3 lag:

  • deployment
  • configuration language & resource abstratcion layer
  • transactional layer

Deployment

Puppet deployeres vanligvis som en enkel klient / server modell, hvor serveren kalles "puppet master", klienten kalles "agent" og de enkelte maskinene / hosts er definert som noder.

Masteren kjøres som en tjeneste / daemon og har de nødvendige konfigurasjoner. Agenten kobler seg til master via kryptert SSL forbindelse og henter / pull det som trengs av konfigurasjon. Om agenten ikke har noen tilgjengelig konfigurasjon eller konfigurasjonen allerede er satt, skjer det ingenting.

Et vanlig oppsett er å kjøre puppet som en deamon som sjekker med master om alt er up-top-date. Dette kan gjøres f.eks hver halvtime. Man kan også velge å kjøre puppet i standalone modus, uten en puppet master. Oppsett / konfigurasjon installeres da lokalt på maskinen og puppet kjøres for å iverksette oppsettet.

Configuration language & resource abstratcion layer

Vi bruker et deklarativt språk for å definere konfigurasjonsenheter som kalles resources / ressurser i puppet. Dette gjør at vi forholder oss til hvilken tilstander vi ønsker, og overlater problemet med å oppnå disse til puppet. De fleste andre konfigurasjonsspråk anses som imperative da de forholder seg til hvordan ting skal gjøres.

Eks: Vi har et blandet miljø med RHEL, Ubuntu og Solaris maskiner, og vi ønsker å installere VIM.

Skal vi scripte dette vil vi kunne få følgende trinn:

  • koble til maskin / host (inkludert autentisering).
  • sjekke om VIM allerede er installert. Dersom ikke, bruker vi systemets pakkeverktøy for å installere VIM. Det vil si at vi potensiellt får forskjellig fremgangsmåte for hver maskin (yum, apt-get osv).
  • rapporter tilbake om alt gikk som forventet.

I puppet starter vi i andre enden, d.v.s sluttilstanden "VIM er installert", og får da følgende:

  • package {"vim": ensure=>present,}

Vi definerer en konfigurasjonsressurs for vimpakken. En ressurs består av 'type' (pakke, tjenester, cronjob), en tittel (vim) og attributter som hører til (om en tjeneste er startet / stoppet o.l).

  • type {title: attribute=>value,}

Puppet kommer med mange predefinerte typer, og vi ka defiere våre egne typer etter behov.

Vi har også mange attributter som hører til typene. F.eks 'present' (installerer en pakke) og 'absent' (fjerner en pakke).

Når vi har opprettet en ressurs vil puppet holde orden på hvordan ressursen skal administreres når en agent kobler til. For å holde styr på 'hvordan' bruker puppet det som kalles en 'provider'. En 'provider' inneholder alle detaljene om 'hvordan' ting skal gjøres. Eksempelvis finnes det over 20 forskjellige 'providers' for ressurstypen 'package' som dekker pakkesystemer som yum, aptitute, pkgadd med flere.

Når en agent kobler til bruker puppet et verktøy som hetter 'Facter' for å få informasjon om agenten. Om 'Facter' rapporterer tilbake at dette er en Ubuntu host, vil puppet bruke en package provider som kjører aptitude, for CentOS vil tilsvarende package provider kjøre yum.

Puppet vil rapportere tilbake om resultatet av operasjonene.

Transactional layer

Dette er selve motoren i systemet, og består av følgende punkter:

  • tolke og kompilere konfiugarsjonen
  • sende den kompilerte konfigurasjonen til agenten
  • bruk konfiugasjonen på agenten
  • rapporter tilbake resultatet til master

Puppet er idempotent, på den måten at man kan bruke en konfigurasjon gjentatte ganger, og være sikker på at man får samme resultat hver gang.