Vagrant

10/2015 / Milan "perún" Herda / @moriquend / hrad.perunhq.org

O čom budeme hovoriť

  • čo je Vagrant
  • aká je motivácia k jeho použitiu
  • základy používania
  • ukážka

Čo je Vagrant?

Vagrant je nástroj poskytujúci jednotné konfiguračné rozhranie k viacerým virtualizačným riešeniam (VirtualBox, VMware, AWS...).

Cieľom je uľahčiť tvorbu, konfiguráciu a klonovanie virtuálnych serverov.

K čomu je to dobré?

1. Jednotné vývojové prostredie pre vývojárov so zachovaním osobných preferencií

2. Žiadna potreba konfigurácie pre členov tímu

3. Bezpečné prostredie pre testovanie a pokusy

Príklad

  • všetci vývojári pracujú s rovnakou verziou PHP, MySQL, Apache
  • ich lokálna kópia projektu beží na Linuxe
  • napriek tomu pracujú pod Windows/MacOS a vo svojom obľúbenom IDE
  • nemuseli nič z tohto konfigurovať
  • a na ich počítači nemusí byť žiadne PHP, Apache ani MySQL nainštalované

Ako to vyzerá?

  • ráno prídete do práce
  • na svojom počítači v adresári s projektom spustíte vagrant up
  • spustí sa virtuálny server s nakonfigurovaným prostredím, v ktorom bude bežať projekt/webstránka
  • otvoríte si zdrojáky vo svojom IDE na svojom počítači a pracujete

Jednotné vývojové prostredie a zároveň možnosť pracovať so svojimi obľúbenými nástrojmi je zabezpečená zdieľaním projektového adresára medzi počítačom a virtuálnym serverom.

V praxi len zopár ľudí z tímu pripravuje konfiguráky pre Vagrant a zvyšok tímu ich len pasívne používa.

Napriek tomu je dobré, pokiaľ jednotlivý vývojári vedia o Vagrante viac, než len základné príkazy.

Základné príkazy

Keď vám už niekto dal Vagrantfile

  • vagrant up
  • vagrant halt
  • vagrant ssh

vagrant up

Naštartuje virtuálny server. Je to ekvivalent k spusteniu počítača.

Pokiaľ ide o prvé spustenie, tak bude trvať dlhšie, lebo virtuálny server je potrebné najskôr "nainštalovať".

vagrant halt

Vypne virtuálny server. Ekvivalent k vypnutiu počítača.

Pokiaľ ste robili na serveri nejaké zmeny, tak tieto sa nestratia.

vagrant ssh

Pripojenie sa na virtuálny server, pokiaľ na ňom potrebujete vykonať nejaké príkazy.

Konfigurácia

Vagrantfile

Súbor (zväčša) v adresári projektu, ktorý definuje konfiguráciu virtuálneho servera.

Je to obyčajný zdroják v Ruby (čo dáva veľmi široké možnosti).

Chcem Ubuntu Precise, 32b


Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"
end
                    

Chcem port 80 nasmerovať na 8080


Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"

  config.vm.network "forwarded_port", guest: 80, host: 8080
end
                    

Chcem mať na serveri k dispozícii adresár ../data


Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"

  config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.synced_folder "../data", "/vagrant_data"
end
                    

Chcem mať nainštalovaný apache


Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"

  config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.synced_folder "../data", "/vagrant_data"

  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y apache2
  SHELL
end
                    

Provisioning

Provisioning je konfigurácia a customizácia servera po "inštalácii":

  • inštalácie softvéru
  • úprava konfigurákov
  • vytvorenie virtualhostov, databáz, kopírovanie dát

Keďže Vagrantfile je obyčajný zrojový kód v Ruby, tak možnosti provisioningu sú v podstate neobmedzené.

Ruby môže vykonať hocijaký príkaz alebo odovzdať kontrolu inému skriptu.

Táto vlastnosť sa využíva na tvorbu rôznych nástrojov zjednodušujúcich prípravu Vagrantfile.

Napríklad PuPHPet

Modelový príklad

CI server pre Domeliu

Pôvodný nápad

Nainštalujem si u seba CI nástroj, ktorý mi spustí testy pre Domeliu vždy, keď sa urobí push do vybraných branchov.

CI nástroje fungujú tak, že pre každé spustenie vytvárajú nový build projektu.

Tj. naklonovanie projektu, composer, bower, grunt, tvorba databázy...

Zabezpečuje sa tým kontrola, že projekt je vždy v zostaviteľnom stave, čiže všetky kroku od naklonovania repozitáru až po úspešné rozbehanie sú bez problémov.

Projekt musí mať nejakú konfiguráciu, ktorou sa CI nástroj bude riadiť by tvorbe buildu.

Táto je zväčša uložená v špeciálnom súbore v adresári projektu (.travis.yml, phpci.yml atď)

Problém

Kvôli vytváraniu databázy musí byť v konfiguráku a zdrojákoch projektu uložené heslo k databáze pre používateľa s root právami.

Lenže každý má svojho usera a svoje heslo

Nedám predsa svoje heslo hocikomu k dispozícii

Riešenie

Prevádzkovať CI v prostredí, ktoré je bezpečné a kde nebude prekážať znalosť root hesla k databáze.

Virtuálny server!

Postavenie servera

1. inštalácie

  • VirtualBox
  • Vagrant

2. vyklikať konfiguráciu v PuPHPet

  • aký OS
  • PHP
  • Apache + virtualhost
  • MySQL

3. inštalácia PHPCI na server

  • pomocou vlastného shell skriptu

4. ladenie

  • otestovať
  • opraviť chybu
  • vagrant destroy
  • vagrant up
  • rinse and repeat

Profit!

Ukážka

Otázky?

Ďakujem za pozornosť