Vagrant Vad, varför och hur

Den här artikeln hjälper dig att gå igenom Vagrant för att hantera dina virtuella maskinförekomster och förklara hur du kan utnyttja marionetten för att tillhandahålla olika resurser, som PHP och PostgreSQL.


Introduktion

Utvecklare har ett stort urval av sätt att bygga sin webbutvecklingsmiljö.

Utvecklare har ett stort urval av sätt att bygga sin webbutvecklingsmiljö. Du kan använda "lokala" alternativ, till exempel installera förinstallerade "all-in-one" -serverstackar, till exempel Zend Server, XAMPP, MAMP, WAMP, etc., eller du kan installera komponenterna själv från källan eller via pakethanteringssystem som Homebrew, Apt och Yum.

Detta kan byggas upp när du arbetar på olika projekt med: PHP 5.3 och PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS, etc. Om du uppgraderar eller dör datorn , du måste börja om igen.

Du kan ha en "fjärrinstallation" med hjälp av en server på nätverket med Samba-aktier eller en SSH-server monterad med ett verktyg som ExpanDrive. Det senare alternativet kan leda till latens på filen läser / skriver, vilket är extremt irriterande. Du kan använda SSH + Vim för allt, vilket är snabbt, men det fungerar bara om du vill använda Vim för allt.


Utveckling kontra produktion

Medan du kanske är nöjd med hur du gör saker just nu, hur många har du hört (eller sagt) "Jo det fungerar på min dator". Detta är fruktansvärt vanligt och det händer när miljöer skiljer sig från ens den mest triviala detaljerna.

Det är oerhört viktigt att du ser till att din utvecklingsmiljö är identisk med produktionsmiljön och matchar staging och testservrar om du har de också.

Det kan låta enkelt om du bara tänker på att installera Apache, PHP och en kopia av MySQL, men det finns en miljon faktorer att tänka på. Om du utvecklar på OSX och distribuerar till ett Ubuntu-system kommer du att märka roliga problem med filkapitalisering. Detta är vanligt i CodeIgniter, när någon har ett bibliotek med en liten bokstav. Den laddas bra på OSX, men kommer att bryta när den läggs i produktion. Din utvecklingsprocess kan ha precis förlorat dig något företag, allt på grund av någon trivial OS-skillnad som ingen tänkte på tills det var för sent.


Utveckling = Produktion

Tvinga utvecklare att använda samma operativsystem kommer att leda till problem.

Så vad är lösningen? Tvinga alla dina utvecklare att kasta ut sina olika verktyg och utveckla på exakt samma modell av bärbar dator? Om dina utvecklare alla får helt nya Macbooks, får du kanske inte för många klagomål, men då behöver du använda OSX Server för allt.

Du kan använda Linux för allt, men då måste du kämpa över vilken distribution som ska användas. Att tvinga utvecklare att använda samma operativsystem kommer att leda till problem, minskad produktivitet och främja nerdkamp.

Virtualisering är svaret och det är inget nytt, men när folk tänker på virtualisering tänker de ofta på prestandafrågor och deras fans spinnar vildt medan deras bärbara dator desperat försöker köra två operativsystem.

Det kan fortfarande vara fallet att försöka köra Windows på en lågdriven maskin, men i dag har en genomsnittlig Mac 4 GB RAM ur lådan, vilket är mer än tillräckligt för att driva en Ubuntu-serverinstallation som körs i kommandoradsläget och alla dina vanliga utvecklingsverktyg (IDE, webbläsare, felsökningsverktyg, etc.). Det finns några alternativ för virtualisering, men jag föredrar VirtualBox från Oracle (vilket är gratis). Denna programvara gör allt tungt för virtualiseringen, då hanterar ett verktyg som kallas Vagrant instanserna.


Steg 1 - Installera VirtualBox

Först hämta VirtualBox och installera den. På * nix-system (Mac OSX, Linux, etc) måste du ändra din .bash_profile (eller .zsh_profile) för att förlänga din $ PATH variabel:

PATH = $ PATH: /Applications/VirtualBox.app/Contents/MacOS/ export PATH

Detta gör det möjligt för Vagrant att veta var VirtualBox är installerat, och det kommer givetvis att variera för olika operativsystem.


Steg 2 - Installera Vagrant

Du kan ladda ner en vagrantbyggnad för ditt operativsystem, eller installera det som en pärla om en inte är tillgänglig:

$ gem installation vagrant

Steg 3 - Skapa en instans

Gör någonstans för din vagrantuppsättning att leva:

mkdir -p ~ / Vagrant / test cd ~ / vagrant / test

Vi använder Ubuntu 12.04 LTS (Precise Pangolin), som redan har en "box" uppbyggd.

vagrant box lägg till precise32 http://files.vagrantup.com/precise32.box

Du ser här argumentet "precise32" som är ett smeknamn för webbadressen. Du kan nu skapa en instans, som hämtar denna .box.

vagrant init precise32 vagrant up

Det kommer nu att springa. Lätt! Om du vill komma in i denna instans, via SSH, använd det här kommandot:

vagrant ssh

Steg 5 - Konfiguration

Du kommer att ha en fil, kallad Vagrantfile, som innehåller konfiguration för denna instans:

# - * - läge: ruby ​​- * - # vi: set ft = ruby: Vagrant :: Config.run do | config | config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" # Tilldela denna VM till en IP-värd för värdnätverk, så att du får åtkomst till den # via IP. Host-only-nätverk kan prata med värddatorn såväl som # andra maskiner i samma nätverk, men kan inte nås (via detta # nätverksgränssnitt) av externa nätverk. config.vm.network: hostonly, "192.168.33.10" # Ställ in standardprojektdelningen för att använda nfs config.vm.share_folder ("v-web", "/ vagrant / www", "./www",: nfs = > true) config.vm.share_folder ("v-db", "/ vagrant / db", "./db",: nfs => true) # Vidarebefordra en port från gästen till värden, vilket möjliggör utanför # datorer för att komma åt VM, medan värdens enda nätverk inte gör det. config.vm.forward_port 80, 8080 # Ställ tidszonen på något användbart config.vm.provision: skal,: inline => "echo \" Europa / London \ "| sudo tee / etc / timezone && dpkg-reconfigure --frontend icke-interaktiv tzdata "# Uppdatera servern config.vm.provision: skal,: inline =>" apt-get update --fix-missing "# Aktivera docka config.vm.provision: marionett göra | marionett | puppet.facter = "fqdn" => "local.pyrocms", "hostname" => "www" puppet.manifests_path = "marionett / manifestationer" puppet.manifest_file = "ubuntu-apache2-pgsql-php5.pp" marionett .module_path = "marionett / moduler" änden

Detta, om du inte hade märkt, är Ruby-syntax; så du kan bli ganska kreativ med den här filen, men det här är grunderna.

Det kommer att visa vilket smeknamn som ska användas och ha webbadressen om smeknamnet inte är upprättat lokalt (bra för att dela med dig).

De dela mapp linjer är verkligen användbara för att mappa en mapp i förekomsten till en lokal mapp. Använder sig av nfs => sant Instansen kommer att kunna skriva och ändra behörigheter för filerna, vilket är användbart om du till exempel försöker installera ett CMS där.

Port vidarebefordran låter dig komma åt din instans på http: // localhost: 8080 och naturligtvis, ändra det till en annan hamn om det konflikter.

Den här konfigurationsfilen ställer även tidszonen till Europa / London och kör sedan apt-get uppdatering, vilket bör tvinga ditt system att vara aktuellt när det startas. Om du hoppar över det här konfigurationsobjektet kan du hitta flera paket vägrar att installera eftersom referenserna är föråldrade.

När du ändrar config kan du ladda om instansen för att använda den:

vagrant reload

Nu när våra servrar kör och redo att gå måste vi installera lite programvara. Vi ska inte bara apt-get install en massa paket via kommandoraden, vi ska "tillhandahålla" våra servrar.


Steg 4 - Leverans

Server tillhandahållande är inte något som många utvecklare behöver tänka på.

Server tillhandahållande är inte något som många utvecklare behöver tänka på, eftersom det normalt lämnas till sysadmins. Tanken är att få reda på vilken mjukvara och konfiguration som har gjorts på en server så att du kan skapa nya utvecklingsmiljöer, nya staging-servrar som replikerar produktion eller gör en annan produktionsserver för att ladda balans mellan de två.

Gamla skolan

Hur sysadminerna hanterar detta varierar, men alla typer av lösningar har tidigare använts - från att hålla en wiki kommandon köra (som kan bli stor och föråldrad snabbt) och det fantastiska sättet att ha en "multiterminal", där du skriver kommandon i ett fönster och det replikerar samma kommandon på en annan 7 servrar samtidigt. Dessa metoder är alla hemska.

En lösning skulle vara att bygga din egen .låda fil eller skapa .iso säkerhetskopieringar så nya servrar kan bara baseras på det, men att behålla dessa bilder skapar mycket extra arbete, och oavsett hur svårt du försöker kommer dessa utvecklingsmaskiner att bli synkroniserade i takt med att tiden går vidare.

Modern provisioning

Det finns två populära system just nu, kallad marionett och kock.

Det finns två populära system just nu, kallad marionett och kock. Båda har funnits i åratal, men har börjat bli mycket mer populära med ökningen av DevOps utvecklingsmetod. Idéerna för båda är likartade och du borde undersöka båda systemen, men denna handledning kommer att fokusera uteslutande på marionett.

I grund och botten, istället för att köra ett gäng kommandon och hoppas allt fungerar bra, bygger du en manifest för marionett som förklarar allt som du behöver se till att det har gjorts. När du kör ett kommando i terminalen, säger du i princip till datorn:

"Installera Apache"

Med marionett skulle vi säga:

"Kontrollera att Apache är installerat"

Eller istället för:

"Skapa en ny mapp, kallad I / var / www och ange behörigheter till www-data: www-data "

Med marionett skulle vi säga:

"Säkerställa I / var / www existerar och har behörigheter som matchar www-data: www-data "

Skillnaden här är att dessa manifest kan köras flera gånger (på ett cronjobb per timme eller dagligen) för att hålla saker uppdaterade och det kommer inte att bli oväntade resultat från något som försöker installera två gånger.

Det kommer också att hjälpa dig att testa att allt körs som förväntat, eftersom någon av dessa regler misslyckas kommer att kasta fel som är enklare att spåra än att gripa en stor mängd bash-kommandoresultat. Dockan kommer att kasta stora röda fel så att du vet att PHP inte installerade, eller att en specifik modul inte kunde konfigureras.

Manifest och Moduler

Manifest är lite förvirrande först, men efter ett tag, börjar de förstå.

För att granska ett grundläggande exempel:

file 'testfile': path => '/ tmp / testfile', försäkra => present, mode => 0640, content => "Jag är en testfil.",

Inget behov av att förklara vad som händer här, rätt?

Den här filen kan senare refereras till i ditt manifest som "testfil" vilket betyder att det kan anges som ett beroende av andra åtgärder.

För ytterligare exempel hänvisar vi till PyroCMS-marionettmanualerna på GitHub.

inkludera apache $ docroot = '/ vagrant / www / pyrocms /' $ db_location = "/vagrant/db/pyrocms.sqlite" # Apache installations klass 'apache :: php': apache :: vhost 'local.pyrocms' : priority => '20', port => '80', docroot => $ docroot, configure_firewall => false, a2mod 'rewrite': försäkra => presentera; 

Detta inkluderar "apache" -modulen, ställer in några variabler, kör det extra "apache :: php" -fragmentet i apache-modulen, ställer in en virtuell värd och ser till att "mod_rewrite" är aktiverat.

Alla dessa klasser definieras i Apache-modulen som vi inkluderade.

Fortsätt, vi vill också installera PHP:

inkluderar php php :: modul ['xdebug', 'pgsql', 'curl', 'gd']: notify => [Tjänst ['httpd'],], php :: conf ['pdo' pdo_pgsql ']: require => Paket [' php5-pgsql '], notify => Tjänst [' httpd '],

Denna bit av manifest kommer att installera de PHP-förlängningar vi behöver, då anmäla Alternativet låter Apache veta att du har installerat en ny konfiguration, vilket innebär att den startas om.

inkluderar postgresql class 'postgresql :: server': postgresql :: db 'pyrocms': ägare => 'pyrocms', lösenord => 'lösenord',

Detta kommer att skapa en postgres-server, skapa en databas, kallad "pyrocms" och se till att en användare, kallad "pyrocms" existerar med lösenordet som tillhandahålls.

Nästan klar! Det sista steget är att se till att du har skrivbara filer och mappar som är rätt inställda:

fil $ docroot: försäkra => 'katalog', fil "$ docroot system / cms / config / config.php": försäkra => "presentera", läge => "0666" $ docroot], $ writeable_dirs = ["$ docroot system / cms / cache /", "$ docroot system / cms / config /", "$ docroot addons /", "$ docroot / cache / "," $ docroot uppladdningar / "] fil $ writeable_dirs: secure =>" directory ", mode => '0777', kräver => Fil [$ dokroot]

Detta kommer att se till att Apache-dokumentroten finns där, config-filen är inställd till 0666, och några skrivbara mappar är inställda på 777.

Där har vi det!

För att köra allt detta, starta om din vagrantinstans, eller kör:

vagrant bestämmelse

Om allt har fungerat korrekt bör du se massor av blå textsignaler att allt installeras, men om något går fel ser du rött. Google dessa fel och försök igen.

Modulerna som används här är: Apache, Postgres, PHP och du kan se det hela i åtgärd genom att klona PyroCMS Vagrant repo:

git klon - recursive git: //github.com/pyrocms/devops-vagrant.git ~ / vagrant / pyrocms cd ~ / vagrant / pyrocms vagrant up

Peka din webbläsare till http: // localhost: 8089 / och du bör se installationsprogrammet. Lätta grejer, va?

Notera: Detta kommer att installeras med MySQL, eftersom PyroCMS Postgres och SQLite stöd fortfarande är i utveckling, och väntar på några CodeIgniter PDO-funktioner som ska fyllas i. Om du är intresserad kan du experimentera genom att ändra Vagrantfilen för att använda ubuntu-apache2-pgsql-php5.pp manifestera, förstöra förekomsten, starta sedan upp igen. Den pyrocms submodule kommer också att behöva checkas ut för att funktionen / pdo


Sammanfattning

I den här artikeln använde vi Vagrant, VirtualBox och Dollette för att inte bara ställa in en serverns förekomst för att vi ska arbeta med, men vi har skapat en testpaket för vår server för att säkerställa att allt körs, installeras och konfigureras ordentligt.

Vi har också skapat en checklista för krav och kommer i framtiden att kunna skapa ett antal identiska servrar i minuter, inte timmar!