Acest articol vă va ajuta să vă deplasați prin utilizarea Vagrantului pentru a vă administra instanțele mașinii virtuale și să explicați cum puteți profita de Puppet pentru a furniza diverse resurse, cum ar fi PHP și PostgreSQL.
Dezvoltatorii au o mare varietate de modalități de a-și construi mediul de dezvoltare web.
Dezvoltatorii au o mare varietate de modalități de a-și construi mediul de dezvoltare web. Puteți utiliza opțiunile "locale", cum ar fi instalarea stivelor de server "all-in-one" pre-construite, cum ar fi serverul Zend, XAMPP, MAMP, WAMP etc. pachete de sisteme de management cum ar fi Homebrew, Apt și Yum.
Acest lucru se poate construi pe măsură ce lucrați la diferite proiecte cu: PHP 5.3 și PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS etc. , va trebui să începeți din nou.
Ați putea avea o configurație "la distanță", utilizând un server în rețea cu acțiuni Samba sau un server SSH montat cu un instrument precum ExpanDrive. Ultima opțiune poate duce la latență la fișierele de citire / scriere, care sunt extrem de enervante. Ai putea folosi SSH + Vim pentru tot ceea ce este rapid, dar asta functioneaza doar daca vrei sa folosesti Vim pentru tot.
În timp ce s-ar putea să fiți mulțumiți de modul în care faceți lucrurile acum, câți dintre voi ați auzit (sau ați spus) "Ei bine, funcționează pe calculatorul meu". Acest lucru este oribil obișnuit și se întâmplă atunci când mediile diferă chiar și prin cele mai triviale detalii.
Este extrem de important să vă asigurați că mediul dvs. de dezvoltare este identic cu mediul de producție și se potrivește serverelor de staționare și de testare dacă aveți și ele aceleași.
Acest lucru ar putea fi ușor dacă vă gândiți să instalați Apache, PHP și o copie a MySQL, dar există un milion de factori de gândit. Dacă sunteți în curs de dezvoltare pe OSX și implementarea într-un sistem Ubuntu, atunci veți observa probleme distractive cu capitalizarea fișierului. Acest lucru este obișnuit în CodeIgniter, când cineva are o bibliotecă cu o primă literă mică. Se va încărca bine pe OSX, dar se va sparge când va fi lansat în producție. Procesul dvs. de dezvoltare ar fi putut doar să vă fi pierdut o anumită afacere, tocmai datorită unei diferențe de sistem trivial, pe care nimeni nu a crezut-o până nu a fost prea târziu.
Forțând dezvoltatorilor să folosească același sistem de operare va duce la probleme.
Deci, care este soluția? Fortați toți dezvoltatorii să-și arunce diferitele instrumente și să se dezvolte pe același model de laptop? În cazul în care dezvoltatorii dvs. primesc toate noile MacBooks, atunci este posibil să nu primiți prea multe plângeri, dar atunci va trebui să utilizați serverul OSX pentru tot.
Ai putea folosi Linux pentru tot, dar atunci trebuie să te lupți cu distribuția pe care să o folosești. Forțând dezvoltatorilor să folosească același sistem de operare va duce la probleme, la reducerea productivității și la promovarea luptei împotriva teroriștilor.
Virtualizarea este răspunsul și nu este nimic nou, dar atunci când oamenii se gândesc la virtualizare, adesea se gândesc la probleme de performanță, iar fanii lor se rotesc sălbatic, în timp ce laptopul lor încearcă cu disperare să ruleze două sisteme de operare.
Acest lucru poate fi în continuare în cazul încercării de a rula Windows pe o mașină cu putere redusă, dar în aceste zile, un mediu Mac are 4 GB de memorie RAM, ceea ce este mai mult decât suficient pentru a alimenta o instalare a serverului Ubuntu care rulează în modul linie de comandă și toate instrumentele obișnuite de dezvoltare (IDE, browser, instrumente de depanare, etc). Există câteva opțiuni pentru virtualizare, dar prefer VirtualBox de la Oracle (care este gratuit). Acest software face toate ridicările grele pentru virtualizare, apoi un instrument numit Vagrant gestionează instanțele.
Mai întâi descărcați VirtualBox și instalați-l. Pe sistemele * nix (Mac OSX, Linux, etc), va trebui să vă modificați .bash_profile
(sau .zsh_profile) pentru a vă extinde $ PATH
variabil:
PATH = $ PATH: /Applications/VirtualBox.app/Contents/MacOS/ export PATH
Acest lucru va permite Vagrantului să știe unde este instalat VirtualBox și va varia, desigur, pentru diferite sisteme de operare.
Puteți descărca un constructor vagabond pentru sistemul dvs. de operare sau îl puteți instala ca bijuterie dacă nu este disponibil:
$ gem instalare vagrant
Faceți-vă undeva pentru setările vagabonților să trăiască:
mkdir -p ~ / Vagrant / test cd ~ / Vagrant / test
Vom folosi Ubuntu 12.04 LTS (Precise Pangolin), care are deja o "cutie".
caseta vagon adaugă exact32 http://files.vagrantup.com/precise32.box
Vedeți aici argumentul "precise32", care este o poreclă pentru adresa URL. Acum puteți crea o instanță, care va descărca această .box.
vagrant init precise32 vagrant up
Acum se va executa. Uşor! Dacă doriți să intrați în acest exemplu, prin SSH, utilizați această comandă:
vagrant ssh
Veți avea un fișier, numit Vagrantfile
, care conține configurația pentru această instanță:
# - * - modul: ruby - * - # vi: set ft = ruby: Vagrant :: Config.run do | config | config.vm.box = "precise32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" # Atribuiți acest VM într-o rețea IP de rețea gazdă, permițându-i să-l accesați # prin intermediul IP. Numai rețelele gazdă pot vorbi cu mașina gazdă, precum și cu alte mașini din aceeași rețea, dar nu pot fi accesate (prin această interfață de rețea #) de către alte rețele externe. config.vm.network: hostonly, "192.168.33.10" # Setați cota de proiect implicită pentru a utiliza nfs config.vm.share_folder ("v-web", "/ vagrant / www", "./www" > true) config.vm.share_folder ("v-db", "/ vagrant / db", "./db",: nfs => true) # Redirecționați un port de la invitat la gazdă, computerele pentru a accesa VM-ul, în vreme ce rețeaua de găzduire nu are loc. config.vm.forward_port 80, 8080 # Setați fusul orar pentru ceva util config.vm.provision: shell,: inline => "echo \" Europa / Londra \ "| sudo tee / etc / timezone && dpkg-reconfigure - neinteractive tzdata "# Actualizați serverul config.vm.provision: shell,: inline =>" apt-get update --fix-missing "# Activați Puppet config.vm.provision: puppet do | puppet | "puppet.facter = " fqdn "=>" local.pyrocms "," hostname "=>" www " puppet.manifests_path =" puppet / manifest "puppet.manifest_file =" ubuntu-apache2-pgsql-php5.pp " .module_path = capătul "puppet / modules"
Aceasta, dacă nu ați fi observat, este sintaxa Ruby; astfel încât puteți obține destul de creativ cu acest fișier, dar acesta este elementul de bază.
Acesta va arăta ce pseudonim să folosească și să aibă URL-ul în cazul în care porecla nu este configurată la nivel local (bună pentru partajare în jur).
distribuie dosarul
liniile sunt într-adevăr utile pentru maparea unui dosar în instanță într-un folder local. Utilizarea nfs => true
instanța va putea să scrie și să modifice permisiunile fișierelor, ceea ce este util dacă încercați, de exemplu, să instalați un CMS acolo.
Funcția de redirecționare a porturilor vă permite să accesați instanța dvs. http: // localhost: 8080
și, bineînțeles, să schimbați asta într-un port diferit, dacă acest lucru este în conflict.
Acest fișier de configurare va seta, de asemenea, fusul orar în Europa / Londra, apoi rulați apt-get update
, care ar trebui să forțeze sistemul dvs. să fie actualizat de fiecare dată când este pornit. Dacă ignorați acest articol de configurare, puteți găsi mai multe pachete care refuză să se instaleze, deoarece referințele sunt acum învechite.
Când schimbați config, puteți reîncărca instanța pentru ao folosi:
reîncărcarea vagonului
Acum, dacă serverele noastre rulează și sunt gata să meargă, trebuie să instalăm niște software. Nu o să mergem apt-get install
o grămadă de pachete prin linia de comandă, vom "furniza" serverele noastre.
Furnizarea de servicii pentru server nu este ceva la care trebuie să se gândească mulți dezvoltatori.
Furnizarea de servicii pentru server nu este ceva ce trebuie să se gândească mulți dezvoltatori, așa cum este în mod normal lăsat la sysadmins. Ideea este să faceți o înregistrare a software-ului și a configurației pe un server, astfel încât să puteți crea noi medii de dezvoltare, noi servere de staționare care replică producția sau să faceți un alt server de producție pentru a încărca echilibrul între cele două.
Cum manipulează sysadmins acest lucru, dar în trecut au fost folosite tot felul de soluții - de a păstra un wiki de comenzi rulate (care pot deveni mari și depășite repede) și abordarea minunată de a avea un "terminal multiplu" comenzi într-o singură fereastră și replică aceleași comenzi pe alte 7 servere în același timp. Aceste metode sunt toate teribile.
O soluție ar fi să vă construiți propria .cutie
fișier sau creați .izo
backup-uri, astfel încât serverele noi să se poată baza doar pe asta, dar menținerea acestor imagini creează o mulțime de lucruri suplimentare și indiferent cât de greu încercați, aceste mașini de dezvoltare vor deveni sincronizate cu timpul.
Există două sisteme populare în acest moment, numite Puppet și Chef.
Există două sisteme populare în acest moment, numite Puppet și Chef. Ambele au fost în jur de ani de zile, dar au început să devină mult mai populare odată cu creșterea metodei de dezvoltare DevOps. Ideile pentru ambele sunt similare și ar trebui să investighezi ambele sisteme, dar acest tutorial se va concentra exclusiv pe Puppet.
În esență, în loc de a rula o grămadă de comenzi și de a speranța că totul funcționează bine, construiți un manifest pentru Puppet explicând tot ce aveți nevoie pentru a vă asigura că a fost făcut. Când rulați o comandă în terminal, spuneți în principiu computerului:
"Instalați Apache"
Cu Puppet, am spune:
"Asigurați-vă că Apache este instalat"
Sau, în loc de:
"Creați un dosar nou, numit
/ Var / www
și setați permisiunile pentru www-data: www-data "
Cu Puppet, am spune:
"Asigura
/ Var / www
există și are permisiuni care se potrivesc www-data: www-data "
Diferența este că aceste manifestări pot fi executate de mai multe ori (pe o lucrare cron orar sau zilnic) pentru a ține lucrurile la zi și nu vor exista rezultate neașteptate din încercarea de a instala de două ori.
De asemenea, vă va ajuta să testați că totul funcționează conform așteptărilor, deoarece oricare dintre aceste reguli eșuează, va arunca erori care sunt mai ușor de urmărit decât să creeze o cantitate imensă de rezultate de comandă bash. Puppetul va arunca erori roșii mari, permițându-vă să știți că PHP nu a instalat sau un modul specific nu a putut fi configurat.
Manifesturile sunt ușor confuze la început, dar, după un timp, încep să aibă sens.
Pentru a revedea un exemplu de bază:
fișier 'testfile': path => '/ tmp / testfile', asigurați => prezent, mode => 0640, content => "
Nu este nevoie să explicați ce se întâmplă aici, corect?
Acest fișier poate fi mai târziu menționat în manifestul dvs. ca "testfile", ceea ce înseamnă că poate fi listat ca o dependență pentru alte acțiuni.
Pentru mai multe exemple, vom face referire la manifestările PyroCMS Puppet pe GitHub.
include apache $ docroot = '/ vagrant / www / pyrocms /' $ db_location = "/vagrant/db/pyrocms.sqlite" # apache :: php ': apache :: vhost ' local.pyrocms ' : prioritate => '20', port => '80', docroot => $ docroot, configure_firewall => false, a2mod 'rescrie': asigura => prezent;
Aceasta include modulul "apache", stabilește unele variabile, execută manifestul "apache :: php" suplimentar în modulul apache, instalează o gazdă virtuală, apoi asigură că "mod_rewrite" este activată.
Toate aceste clase sunt definite în modulul Apache pe care l-am inclus.
Mergând mai departe, dorim să instalăm PHP:
include php php :: modul ['xdebug', 'pgsql', 'curl', 'gd']: notify => Service ['httpd'], pdo_pgsql ']: necesită => Pachet [' php5-pgsql '], notificare => Service [' httpd '],
Această bucată de manifest va instala extensiile PHP de care avem nevoie, apoi notifica
opțiunea va lăsa Apache să știe că ați instalat o nouă configurație, ceea ce înseamnă că va reporni.
include postgresql clasa 'postgresql :: server': postgresql :: db 'pyrocms': owner => 'pyrocms', password => 'parola'
Acesta va crea un server postgres, va crea o bază de date numită "pyrocms" și va asigura că există un utilizator numit "pyrocms" cu parola furnizată.
Aproape terminat! Ultimul pas este să vă asigurați că aveți fișiere și foldere cu scriere setate corect:
fișierul $ docroot: asigura => 'director', fișier "$ docroot system / cms / config / config.php" $ docroot], $ $ docroot sistem / cms / cache /, $ docroot system / cms / config /, $ docroot addons / / cache / "," $ docroot uploads / "] fișier $ writeable_dirs: ensure =>" director ", mode => '0777'
Acest lucru va asigura că rădăcina documentului Apache este acolo, fișierul config este setat la 0666 și câțiva dosare care pot fi salvate sunt setate la 777.
Acolo o avem!
Pentru a rula toate acestea, trebuie doar să reporniți instanța vagabondă sau să rulați:
vagrant
Dacă totul a funcționat corect, ar trebui să vedeți o mulțime de text albastru care semnalizează că totul este instalat, dar dacă ceva nu merge bine, veți vedea roșu. Google aceste erori și încercați din nou.
Modulele utilizate aici sunt: Apache, Postgres, PHP și puteți vedea totul în acțiune prin clonarea repo-ului vagrant PyroCMS:
clona git - recursivă git: //github.com/pyrocms/devops-vagrant.git ~ / vagrant / pyrocms cd ~ / vagrant / pyrocms vagrant sus
Punctați browserul dvs. la http: // localhost: 8089 /
și ar trebui să vedeți programul de instalare. Lucru ușor, huh?
Notă: Acest lucru se va instala cu MySQL ca PyroCMS's Postgres și suportul SQLite este încă în curs de dezvoltare, așteaptă ca unele caracteristici CodeIgniter DOP să fie finalizate. Dacă sunteți interesat, puteți experimenta schimbând fișierul Vagrant pentru a utiliza ubuntu-apache2-pgsql-php5.pp
manifestați, distrugeți instanța, apoi porniți-o din nou. Submodulul pyrocms va trebui, de asemenea, să fie verificat la funcția / pdo
În acest articol, am folosit Vagrant, VirtualBox și Puppet pentru a nu seta doar o instanță de server pentru care să lucrăm, dar am creat o suită de testare pentru serverul nostru pentru a ne asigura că totul funcționează, se instalează și se configurează corect.
Am creat, de asemenea, o listă de verificări pentru cerințe și, în viitor, vom putea crea orice număr de servere identice în câteva minute, nu ore!