Hvordan å Jumpstart Linux Development med Puppet og Vagrant, del Two

I den første delen av denne opplæringen, vi viste hvordan du bruker Vagrant å automatisere og administrere lokale virtuelle maskiner for en programvare utviklingsmiljø. Vi definerte en enkel Vagrantfile å spesifisere visse attributter for et VM for å kjøre en enkel web-app, og fikk den i gang ved hjelp av landstryker sin kommandolinje verktøy. I denne delen av opplæringen, vil vi bruke Puppet å definere og automatkonfigurasjonsdetaljer for vår VM. På denne måten når vi starter opp dev miljø med sørlig opp, det vil bli satt opp til å kjøre vår web-applikasjon uten noen ekstra manuell konfigurering.

Bruke Puppet å angi systemkonfigurasjonen

Puppet er et svært kraftig verktøy for konfigurering av systemene, og har sitt eget språk for å spesifisere konfigurasjon. Dette språket fungerer på en måte som er litt forskjellig fra mange andre programmeringsspråk: det er deklarative
. Dette betyr at i stedet for å angi en liste over handlinger
at du vil at datamaskinen skal ta (som i et shell script), blir du beskriver et sett med ressurser
at du ønsker å eksistere på systemet. Ressurser er byggesteinene i systemkonfigurasjonen, og de faller i mange typer
som vil være kjent for alle * nix bruker: filer, pakker, brukere og så videre

La oss undersøke et eksempel spesifikke målet for denne opplæringen: å få vår VM for å kjøre en enkel web-applikasjon. I vårt tilfelle, vi ønsker at programmet skal være drevet av Apache, siden det er den tjenesten som skal kjøre programmet i produksjonen. For vår VM for å kjøre et program med Apache, må den ha pakken installert. Vi kan beskrive pakken til dukketeater som dette:

 pakken {"apache2": sikre = > stede,} 

Først forteller vi Puppet hva skriv
av ressursen vi beskriver: en pakke. Så vi fortelle det tittelen
av ressursen: i dette tilfellet, apache2, navnet på pakken vi ønsker installert. Deretter definerer vi sikre attributt
å være til stede. Dette forteller Puppet at vi vil at pakken skal være til stede på vårt system. Vi kan også fortelle Puppet hvilken kilde det skal bruke for å finne en pakke ved å angi en leverandør
; så for eksempel, hvis vi arbeidet med en webapp bruker Ruby on Rails, vi kan fortelle Puppet å installere rails pakken med gemprovider, noe som vil føre til at det å prøve å laste pakken fra RubyGems:

 pakken { "rails": sikre = > stede, leverandør = > perle,} 

Hver type har sitt eget sett med leverandører og attributter som kan brukes til å begrense dine beskrivelser. For eksempel kan du angi version = > "3.0.0" hvis du visste du ville 3.0.0 versjon av en pakke. Det er omfattende dokumentasjon tilgjengelig på Puppet rike type og leverandør system for å hjelpe deg å lære forskjellige måter å beskrive et ønsket system stat med Puppet.

Puppet sanne kraft er at du kan beskrive ressurser til det på en generisk måte (jeg Vil denne filen til å eksistere på det stedet med dette innholdet, jeg ønsker denne tjenesten til å kjøre på denne porten, etc.), og Puppet vil konfigurere systemet for å matche beskrivelsen uavhengig av den enkelte systemet du konfigurerer
. Uansett hvor du kjører den, vil Puppet undersøke den nåværende tilstanden i systemet, sammenligne det til staten du har beskrevet, og deretter gjøre hva den trenger til for å gjøre systemkonfigurasjonen kamp hva du har spesifisert. Dette betyr at vi kunne bytte ut Vagrant boksen i vårt prosjekt for en boxfile basert på et helt annet system, og vår Puppet provisioning vil fortsatt jobbe med bare mindre endringer.

Ved hjelp av det vi har lært om Puppet er deklarative språk, la oss spesifisere noen grunnleggende oppsett for vårt utviklingsmiljø. Denne koden vil gå inn i en manifest
fil. Vi vil definere vårt i sample-dev-env /manifesterer /default.ppbecause dette er standardplasseringen Vagrant søker for Puppet manifestfiler.

 $ mkdir manifesterer $ vim manifesterer /default.ppexec {"apt-get oppdatering ": path = > "/usr /bin",} pakken {"apache2": sikre = > stede, krever = > Exec ["apt-get update"],} tjenesteleverandører {"apache2": sikre = > "kjører", krever = > Pakken ["apache2"],} fil {"/var /www /sample-webapp": sikre = > "link", target = > "/sørlig /sample-webapp", krever = > Pakken ["apache2"], varsle = > Tjenesteleverandører ["apache2"],} $ git legge manifesterer /default.pp $ git commit -m "Basic Puppet manifest" 

Det er noen nye konsepter i dette utvalget, særlig kreve og varsle attributter. Dette tillater deg å uttrykke avhengigheter mellom ressurser slik at ting skjer i riktig rekkefølge. I dette eksempelet har vi presisert at apache2 tjenesten
kan ikke kjøres før apache2 pakke
er installert, og vi har fortalt Puppet å varsle apache2 service når det er linket vårt utvalg webapp katalog i standard Apache dokumentet rot. Vi har også definert en exec ressurser til å kjøre apt-get update før du forsøker å installere Apache-dette er bare for å være sikker på at apt er oppdatert før den prøver å installere noe som helst.

Legg merke til at rekkefølgen som Puppet vil ta visse forholdsregler er ikke anbefale definert av rekkefølgen i filen, som med skall-skript; vi kunne flytte disse ressurs definisjon blokker rundt, og resultatet av å anvende manifest ville forbli den samme.

Sette alt sammen

Nå som vi har en enkel Puppet konfigurasjon definert for proviante VM at Vagrant skaper og forvalter, hvordan skal vi legge alle bitene sammen slik at alt fungerer? Heldigvis Vagrant ble bygget opp fra grunnen med konfigurasjon styringssystemer som Puppet i tankene, så det er veldig enkelt. Alt vi trenger å gjøre er å legge til denne linjen til VM config blokken i vår Vagrantfile:

 config.vm.provision: dukketeater 

Siden vi har lagt vår manifest på standardplasseringen, Vagrant vil automatisk registrere den og bruke den til å klargjøre vår VM. Det betyr at nå, når vi bringer opp vår VM med sørlig opp, vil det automatisk bli satt opp til å vise innhold fra prøven-webapp katalog i vår dev miljø. La oss gi det noe å tjene:

 

$ pwd ~ /sample-dev-env $ mkdir sample-webapp $ vi sample-webapp /index.html
< h1 > Hei, verden! < /h1 >

Nå, hvis du besøker localhost: 3000 /sample-webapp i en nettleser på din lokale maskin, takket være Puppet sin klargjøring og Vagrant port forwarding, bør du se din melding. Du kan fortsette å legge til og redigere filer på din lokale maskin, og endringene vil bli reflektert umiddelbart i det som er servert av Apache eksempel kjører på VM.

Kraften i dette er åpenbar: Nå kan alle utviklere på prosjektet har en lokal VM serverer live oppdatert kode med bare disse kommandoene:

 $ git clone Denne e-postadressen er beskyttet mot programmer som samler. Du må aktivere Javascript for å kunne se den: brukernavnet_ditt /din-dev-env-repo.git $ cd your-dev-env-repo $ git clone Denne e-postadressen er beskyttet mot programmer som samler. Du må aktivere Javascript for å kunne se den: brukernavnet_ditt /din-webapp.git $ sørlig opp 

Det er det! Denne arbeidsflyten kan integreres enda tettere ved å definere et git submodule innenfor utviklingsmiljø for prosjektene det kan brukes til å utvikle seg. Som din Puppet konfigurasjon vokser mer komplekse, kan du finne det nyttig å organisere dine spesifikasjoner i moduler og klasser, eller utforske rikt sett av Puppet modulene er tilgjengelige på Puppet Forge, hvor du kan finne kraftige byggesteiner for Puppet konfigurasjon. Puppet har super awesome dokumentasjon for å hjelpe deg fremgang på reisen. Stryker har også et rikt sett av dokumentasjon tilgjengelig, inkludert grundig dokumentasjon på hvordan Puppet med omflakkende. Hvis bygge denne type utviklingsmiljø interesserer deg, har jeg tatt de enkle maler fra denne opplæringen, og gjort dem tilgjengelig på Github som utgangspunkt.