Denne artikkelen vil hjelpe deg med å bruke Vagrant til å administrere de virtuelle maskininstansene dine, og forklare hvordan du kan dra nytte av marionetten for å tilby ulike ressurser, som PHP og PostgreSQL.
Utviklere har et stort utvalg av måter å bygge deres webutviklingsmiljø på.
Utviklere har et stort utvalg av måter å bygge deres webutviklingsmiljø på. Du kan bruke "lokale" alternativer, for eksempel å installere forhåndsbygde "all-in-one" serverstabler, for eksempel Zend Server, XAMPP, MAMP, WAMP, etc., eller du kan installere komponentene selv fra kilden eller via pakkehåndteringssystemer som Homebrew, Apt, og Yum.
Dette kan bygge opp mens du jobber med ulike prosjekter med: PHP 5.3 og PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS osv. Hvis du oppgraderer eller dør datamaskinen , du må starte om igjen.
Du kan ha et "eksternt" oppsett, ved hjelp av en server på nettverket med Samba-aksjer, eller en SSH-server montert med et verktøy som ExpanDrive. Det sistnevnte alternativet kan føre til latens på filen leser / skriver, noe som er ekstremt irriterende. Du kan bruke SSH + Vim for alt, noe som er raskt, men det fungerer bare hvis du vil bruke Vim for alt.
Mens du kan være fornøyd med hvordan du gjør ting akkurat nå, hvor mange av dere har hørt (eller sa) "Vel, det fungerer på min datamaskin". Dette er horribly vanlig, og det skjer når miljøene varierer med selv den mest trivielle detaljene.
Det er ekstremt viktig å sørge for at utviklingsmiljøet ditt er identisk med produksjonsmiljøet, og samsvarer med oppstart og testing av servere hvis du har de også.
Det kan høres lett ut hvis du bare tenker på å installere Apache, PHP og en kopi av MySQL, men det er en million faktorer å tenke på. Hvis du utvikler på OSX og distribuerer til et Ubuntu-system, vil du legge merke til morsomme problemer med filkapitalisering. Dette er vanlig i CodeIgniter, når noen har et bibliotek med små bokstaver. Det vil bli bra på OSX, men vil bryte når det blir installert til produksjon. Din utviklingsprosess kan bare ha mistet deg noe, alt på grunn av noen trivielle OS-forskjeller som ingen tenkte på før det var for sent.
Tvinge utviklere til å bruke det samme operativsystemet skal føre til problemer.
Så hva er løsningen? Tving alle utviklere dine til å kaste ut sine forskjellige verktøy og utvikle seg på samme modell av bærbar PC? Hvis utviklerne dine får helt nye MacBook-maskiner, får du kanskje ikke for mange klager, men da må du bruke OSX Server for alt.
Du kan bruke Linux for alt, men da må du kjempe over hvilken distribusjon som skal brukes. Tvinge utviklere til å bruke det samme operativsystemet skal føre til problemer, redusert produktivitet og fremme nerdkamp.
Virtualisering er svaret, og det er ikke noe nytt, men når folk tenker på virtualisering, tenker de ofte på ytelsesproblemer og deres fans spinner vilt mens deres laptop forsøkt prøver å kjøre to operativsystemer.
Dette kan fortsatt være tilfelle å prøve å kjøre Windows på en maskin med lavt strømforbruk, men i disse dager har en gjennomsnittlig Mac 4 GB RAM ut av boksen, noe som er mer enn nok til å drive en Ubuntu-serverinstallasjon som kjører i kommandolinjemodus og alle dine vanlige utviklingsverktøy (IDE, nettleser, feilsøkingsverktøy, etc). Det er noen alternativer for virtualisering, men jeg foretrekker VirtualBox fra Oracle (som er gratis). Denne programvaren gjør all den tunge løftingen for virtualiseringen, og et verktøy som kalles Vagrant styrer tilfellene.
Først Last ned VirtualBox og installer den. På * nix-systemer (Mac OSX, Linux, etc), må du endre din .bash_profile
(eller .zsh_profile) for å utvide din $ PATH
variabel:
PATH = $ PATH: /Applications/VirtualBox.app/Contents/MacOS/ eksport PATH
Dette vil tillate Vagrant å vite hvor VirtualBox er installert, og vil selvsagt variere for forskjellige operativsystemer.
Du kan laste ned en vagrantbygg for operativsystemet, eller installere det som en perle hvis en ikke er tilgjengelig:
$ perle installere vagrant
Gjør et sted for vagrantoppsettene dine for å leve:
mkdir -p ~ / Vagrant / test cd ~ / Vagrant / test
Vi bruker Ubuntu 12.04 LTS (Precise Pangolin), som allerede har en "boks" satt opp.
vagrant boks legg til presise32 http://files.vagrantup.com/precise32.box
Du ser her argumentet "presise32" som er et kallenavn for nettadressen. Du kan nå opprette en forekomst, som laster ned denne .boksen.
vagrant init precise32 vagrant up
Det vil nå løpe. Lett! Hvis du vil komme inn i denne forekomsten, via SSH, bruk denne kommandoen:
vagrant ssh
Du vil ha en fil, kalt Vagrantfile
, som inneholder konfigurasjon for denne forekomsten:
# - * - modus: ruby - * - # vi: set ft = ruby: Vagrant :: Config.run do | config | config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" # Tilordne denne VM til en IP-adresse for vertsbasert nettverk, slik at du får tilgang til det # via IP. Vertsbaserte nettverk kan snakke med vertsmaskinen, så vel som # andre maskiner på samme nettverk, men kan ikke nås (via dette # nettverksgrensesnittet) av eksterne nettverk. config.vm.network: hostonly, "192.168.33.10" # Angi standard prosjektdel for å bruke nfs config.vm.share_folder ("v-web", "/ vagrant / www", "./www",: nfs = > true) config.vm.share_folder ("v-db", "/ vagrant / db", "./db",: nfs => true) # Videresend en port fra gjesten til verten, datamaskiner for å få tilgang til VM, mens kun vertsnettverk ikke gjør det. config.vm.forward_port 80, 8080 # Sett tidszonen til noe nyttig config.vm.provision: shell,: inline => "echo \" Europe / London \ "| sudo tee / etc / timezone && dpkg-reconfigure --frontend ikke-interaktiv tzdata "# Oppdater server config.vm.provision: shell,: inline =>" apt-get update --fix-missing "# Aktiver dukketeam config.vm.provision: marionett | marionett | puppet.facter = "fqdn" => "local.pyrocms", "hostname" => "www" puppet.manifests_path = "marionett / manifestasjoner" puppet.manifest_file = "ubuntu-apache2-pgsql-php5.pp" marionett .module_path = "marionett / moduler" slutten
Dette, hvis du ikke hadde lagt merke til, er Ruby-syntaks; slik at du kan bli ganske kreativ med denne filen, men dette er grunnleggende.
Det vil vise hvilket kallenavn du vil bruke og ha URL-adressen hvis kallenavnet ikke er konfigurert lokalt (bra for å dele rundt).
De Del mappe
linjer er veldig nyttige for å kartlegge en mappe i forekomsten til en lokal mappe. Ved hjelp av nfs => sant
forekomsten vil kunne skrive og endre tillatelser av filene, noe som er nyttig hvis du for eksempel prøver å installere et CMS der inne.
Port videresending lar deg få tilgang til din forekomst på http: // localhost: 8080
og selvfølgelig, bytt det til en annen port hvis det er konflikt.
Denne konfigurasjonsfilen vil også sette tidszonen til Europa / London, og deretter kjøre apt-get oppdatering
, som bør tvinge systemet til å være oppdatert når det startes. Hvis du hopper over dette konfigurasjonselementet, kan du finne flere pakker nekter å installere som referansene er nå utdaterte.
Når du endrer config, kan du laste inn forekomsten for å bruke den:
vagrant reload
Nå som våre servere kjører og klar til å gå, må vi installere noe programvare. Vi skal ikke bare apt-get installasjon
En masse pakker via kommandolinjen, vi skal "forsyne" våre servere.
Serverforsyning er ikke noe mange utviklere trenger å tenke på.
Serverforsyning er ikke noe som mange utviklere trenger å tenke på, som det vanligvis er igjen for sysadmins. Tanken er å lage en oversikt over hvilken programvare og konfigurasjon som er gjort på en server, slik at du kan opprette nye utviklingsmiljøer, nye staging-servere som replikerer produksjon, eller lag en annen produksjonsserver for å balansere de to.
Hvordan sysadmins håndterer dette varierer, men alle slags løsninger har blitt brukt tidligere - fra å holde en wiki kommandoer kjørt (som kan bli stor og utdatert raskt) og den fantastiske tilnærmingen til å ha en "multi-terminal", der du skriver kommandoer i ett vindu og det replikerer de samme kommandoene på en annen 7 servere samtidig. Disse metodene er alle forferdelige.
En løsning ville være å bygge din egen .eske
fil, eller opprett .iso
sikkerhetskopier, slik at nye servere bare kan baseres på det, men å opprettholde disse bildene skaper mye ekstra arbeid, og uansett hvor hardt du prøver, vil disse utviklingsmaskinene bli synkroniserte etter hvert som tiden går.
Det er to populære systemer for øyeblikket, kalt marionett og kokk.
Det er to populære systemer for øyeblikket, kalt marionett og kokk. Begge har eksistert i årevis, men har begynt å bli mye mer populært med økningen av DevOps utviklingsmetode. Ideene til begge er like, og du bør undersøke begge systemene, men denne opplæringen vil bare fokusere på marionett.
I hovedsak, i stedet for å kjøre en rekke kommandoer, og håper alt fungerer bra, bygger du et manifest for marionetten som forklarer alt du trenger for å sikre at du har gjort det. Når du kjører en kommando i terminalen, sier du egentlig til datamaskinen:
"Installer Apache"
Med marionett, ville vi si:
"Kontroller at Apache er installert"
Eller, i stedet for:
"Lag en ny mappe, kalt
/ Var / www
og sett tillatelser til www-data: www-data "
Med marionett, ville vi si:
"Sørge for
/ Var / www
eksisterer og har tillatelser som samsvarer med www-data: www-data "
Forskjellen her er at disse manifestene kan kjøres flere ganger (på en cron jobb hver time eller daglig) for å holde ting oppdatert, og det vil ikke være uventede resultater fra noe som prøver å installere to ganger.
Det vil også hjelpe deg med å teste at alt kjører som forventet, da noen av disse reglene feiler, vil kaste feil som er enklere å spore enn å gripe ut en stor mengde bash-kommandoresultater. Dukkene vil kaste store røde feil, slik at du vet at PHP ikke installerte, eller at en bestemt modul ikke kunne konfigureres.
Manifestene er litt forvirrende først, men etter en stund, begynner de å gi mening.
For å se et grunnleggende eksempel:
fil 'testfile': path => '/ tmp / testfile', sikre => present, modus => 0640, content => "Jeg er en testfil.",
Du trenger ikke å forklare hva som skjer her, rett?
Denne filen kan senere refereres til i manifestet ditt som "testfil", som betyr at det kan bli oppført som en avhengighet av andre handlinger.
For ytterligere eksempler, refererer vi til PyroCMS dukkemann manifestene på GitHub.
inkludere apache $ docroot = '/ vagrant / www / pyrocms /' $ db_location = "/vagrant/db/pyrocms.sqlite" # Apache oppsett klasse 'apache :: php': apache :: vhost 'local.pyrocms' : priority => '20', port => '80', docroot => $ docroot, configure_firewall => false, a2mod 'rewrite': sikre => stede;
Dette inkluderer "apache" -modulen, setter opp noen variabler, kjører det ekstra "apache :: php"-manifestet i apache-modulen, setter opp en virtuell vert og sikrer at "mod_rewrite" er aktivert.
Alle disse klassene er definert i Apache-modulen som vi inkluderte.
Fortsett, vi vil også installere PHP:
inkludere php php :: modul ['xdebug', 'pgsql', 'curl', 'gd']: notify => [Tjeneste ['httpd'],], php :: conf ['pdo' pdo_pgsql ']: require => Pakke [' php5-pgsql '], notify => Service [' httpd '],
Denne delen av manifestet vil installere PHP-utvidelsene vi trenger, da gi beskjed
alternativet vil la Apache vite at du har installert ny konfigurasjon, noe som betyr at den vil starte på nytt.
inkluderer postgresql klasse 'postgresql :: server': postgresql :: db 'pyrocms': eier => 'pyrocms', passord => 'passord',
Dette vil sette opp en postgres-server, opprette en database, kalt "pyrocms" og sørg for at en bruker, kalt "pyrocms", eksisterer med passordet som er oppgitt.
Nesten ferdig! Det siste skrittet er å sørge for at du har skrivbare filer og mapper satt riktig:
fil $ docroot: sikre => 'katalog', fil "$ docroot system / cms / config / config.php": sikre => "stede", modus => "0666", krever => Fil [ $ docroot], $ writeable_dirs = ["$ docroot system / cms / cache /", "$ docroot system / cms / config /", "$ docroot addons /", "$ docroot / cache / "," $ docroot opplastinger / "] fil $ writeable_dirs: secure =>" directory ", modus => '0777', krever => Fil [$ dokroot]
Dette vil sikre at Apache-dokumentroten er der, config-filen er satt til 0666, og noen få skrivbare mapper er satt til 777.
Der har vi det!
For å kjøre alt dette kan du bare starte din vagrant-forekomst, eller kjøre:
vagrant bestemmelse
Hvis alt har fungert riktig, bør du se mange blå tekstmeldinger om at alt blir installert, men hvis noe går galt, vil du se rødt. Google disse feilene og prøv igjen.
Modulene som brukes her er: Apache, Postgres, PHP, og du kan se hele greia i handling ved å klone PyroCMS Vagrant repo:
git klone - recursive git: //github.com/pyrocms/devops-vagrant.git ~ / vagrant / pyrocms cd ~ / vagrant / pyrocms vagrant up
Pek nettleseren din til http: // localhost: 8089 /
og du bør se installatøren. Enkle ting, hei?
Merk: Dette vil installere med MySQL som PyroCMS Postgres og SQLite-støtte er fortsatt i utvikling, og venter på at noen CodeIgniter PDO-funksjoner skal fylles ut. Hvis du er interessert, kan du eksperimentere ved å endre Vagrantfile for å bruke ubuntu-apache2-pgsql-php5.pp
manifestere, ødelegge forekomsten, og start den opp igjen. Den pyrocms submodule vil også trenge å bli sjekket ut til funksjonen / pdo
I denne artikkelen brukte vi Vagrant, VirtualBox og Marionette til ikke bare å sette en server forekomst for oss å jobbe med, men vi har opprettet en testpakke for serveren vår for å sikre at alt kjører, installeres og konfigureres på riktig måte..
Vi har også opprettet en sjekkliste for krav, og vil i fremtiden kunne lage et antall identiske servere i løpet av minutter, ikke timer!