1. Virtualizace

Od doby, kdy snad všechny domácí stanice i notebooky mají výkon měřený v gigahertz, paměti mají na rozdávání a velikost disku daleko přesáhla veškterá očekávání, přišla pozvolna doba virtualizace. Ruku v ruce s cloudovým řešením je její použití stále aktuálnější.

Díky technologii Virtualbox od společnosti Oracle může každý zcela zdarma pro své použití pracovat s neomezeným počtem „virtuálních strojů“. Pod tímto termínem si lze představit počítač připojený někde v síti, se kterým se komunikuje výhradně prostřednictvím vzdálené správy (ssh, rdp, …) nebo služeb, které poskytuje (http, ftp, …). Výhoda takového řešení je pak především v možnosti vytváření serverů dle aktuální potřeby bez dalších nákladů na hardware. Virtuální servery je možné téměř libovolně škálovat (nastavit výkon, dostupnou paměť, velikost disku, …) a tak reagovat na aktuální situaci. Jediným limitem jsou parametry počítače, který virtualizaci zajišťuje.

Založit si virtuální server v programu Virtualbox je jednoduché a popisuje to následující manuál. Server je pak potřeba, stejně jako běžný počítač, nainstalovat a nakonfigurovat. Kdyby se však měl každý virtuální stroj instalovat ručně, zabralo by to mnoho času a bylo by zde riziko opomenutí některého důležitého kroku. Za tímto účelem existují již hotové obrazy s předem nainstalovanými a nakonfigurovanými stroji (například obrazy systémů Windows jsou dostupné zcela zdarma). Po spuštění virtuálního stroje je možné ho dále nastavit a případně vytvořit vlastní obraz s uživatelským nastavením.

2. Použití virtuálního stroje

Na rozdíl od vývoje na lokálním počítači je práce s virtuálním strojem komplikovanější. Prakticky je to stejné jako práce s produkčním serverem. Po každé změně je potřeba vystavit kód na server, aby jej bylo možné otestovat. Některá vývojová prostředí (Netbeans, PHPStorm, …) nabízejí možnost takzvaných vzdálených projektů (remote project) kde se kód automaticky po uložení vystaví na server. Virtuální stroj však nabízí možnost sdílené složky která použije složku z lokálního počítače jako síťový disk pro virtuální stroj. Jakmile se v této složce cokoliv změní, je tato změna okamžitě i na virtuálním stroji nebo naopak na lokálním počítači. Tento přístup je navíc výrazně rychlejší a úspornější než synchronizace a podléhá menšímu riziku chyby. Nastaví-li se tedy webový server (Apache, Nginx, …) tak, aby hledal zdrojové kódy právě v této složce, nebude potřeba dále řešit synchronizaci a díky tomu bude možné používat jakýkoliv oblíbený editor.

Virtuální stroj beží na pozadí a lze s ním komunikovat přes síť, kterou je propojen s počítačem na kterém běží. Aby na něm bylo možné vyvíjet webové aplikace, je vhodné nastavit v souboru /etc/hosts (respektive v c:\windows\system32\drivers\etc\hosts pro Windows)jméno virtuálního stroje a síťvou adresu. Případně je také možné nastavit takzvaný „port forward“, který přesměruje komunikaci z portu na lokálním počítači na port virtuálního stroje. Pokud se tedy nastaví že port 80 lokálního počítače bude směrován na port 80 virtuálního stroje, lze nadále používat adresu http://localhost/ avšak její zpracování již bude obslouženo virtuálním strojem.

Díky tomuto přístupu získá programátor unikátní možnost provozovat více rozdílných konfigurací na jednom stroji a tak například otestovat kompatibilitu svého kódu před migrací. Další výhodou je možnost mít virtuální server se stejnými parametry a konfigurací, jaká je na produkčním serveru a díky tomu si vše otestovat dříve, než nastane problém. Mnoho programátorů používá pro práci svůj osobní počítač, který mají nastavený dle jejich osobních preferencí. Virtuální stroj tak nabízí možnost sjednotit konfigraci ve firmě a předejít tak zbytečným problémům s nekompatibilitou. Navíc po skočení práce je možné virtuální stroj vypnout a neomezovat tak výkon počítače při hraní her ve volném čase. Virtuálních strojů je možné spustit i větší množství na jednom počítači a tak otestovat chování na složitější infrastruktuře. Jak je patrné, výhod je opravdu mnoho a určitě zde nejsou popsány všechny.

3. Vagrant

Ačkoliv je instalace virtuálního stroje z obrazu rychlá a dalo by se říct že automatická, je možné automatizovat mnohem více. Například se může hodit mít skript, který pokud možno na jeden příkaz stáhne ze sítě obraz virtuálního stroje, zavede jej do systému i s příslušnou síťovou konfigurací a následně tento systém spustí. Právě za tímto účelem vznikl program Vagrant. Stačí mít adresář obsahující soubor „Vagrantfile“. Tento soubor obsahuje předpis, který virtuální stroj se má spustit. Pokud není v systému zaveden, z které adresy se má stáhnout obraz. Které složky se mají s virtuální strojem sdílet a na jaké adrese bude server naslouchat. Existuje veliké množství obrazů virtuálních strojů připravených pro použití ve spolupráci s programem Vagrant a jejich seznam je možné nalést na stránkách projektu vagrantbox.es. Jakmile je program Vagrant nainstalován na programátorově počítači, stačí v tomto adresáři spustit příkaz vagrant up a všechny výše popsané kroky se provedou zcela automaticky. Lze tak mít konfiguraci jako součást projektu, nebo mít připravené jednotné virtuální prostředí pro všechny firemní projekty.

4. Puppet

Počítač je možné v průběhu času nastavit dle potřeby, ale jak zajistit, že se konfigurace nezmění a případně se konfigurace opět vrátí na požadovanou? Jak zajistit, že se další stroj nakonfiguruje zcela shodně? Jak proces konfigurace zautomatizovat? Všechny tyto otázky vyřeší takzavný „provisioning“. Jedná se o předpis který dokumentuje, jak má být počítač nastaven. Jakmile se konfigurace od předpisu liší, je nemilosrdně přenastavena na předepsanou hodnotu. Toho lze využít mimo jiné pro automatizovanou instalaci systému. Předpis může například obsahovat, že počítač musí mít nainstalovaný a konkrétně nastavený webový server. Jelikož jej počítač po čisté instalaci nainstalovaný nemá, „provisioning” se postará, aby nainstalovaný byl. Jedním z multiplatformních programů, který tato kouzla zajišťuje je Puppet.

Puppet disponuje celou škálou modulů, které usnadňují samotnou konfiguraci předpisu. Jejich přehled je dostupný na adrese Puppet forge, ale není problém si vytvořit modul vlastní. Program Puppet je dobře dokumentován a většina jeho modulů rovněž.

Program Vagrant ve spolupráci s programem Puppet spolupracuje a je tak možné v konfiguračním souboru „Vagrantfile“ říct, že po stažení obrazu a při každém spuštění virtuálního stroje se ještě provede příslušná konfigurace.

5. Ukázková konfigurace

Ačkoliv jsou výše popsané technologie dobře zdokumentovány, sestavit plně funkční konfiguraci nemusí být obzvláště pro začínajícího uživatele jednoduché. Ukázka jedné takové konfigurace virtuálního stroje použitelného pro programátora v jazyce PHP je dostupná na adrese https://github.com/zeleznypa/vagrant. Při bližším pohledu na jednotlivé commity lze vysledovat jednotlivé kroky, jak se dá Vagrant ve spolupráci s programem Puppet nastavit.

Celé prostředí lze díky programu GIT snadno stáhnout na lokální počítač příkazem git clone https://github.com/zeleznypa/vagrant.git. Vzhledem k tomu, že projekt používá submoduly, je nutné je nainstalovat sekvencí příkazů git submodule init a git submodule update v nově vytbořeném adresáři ./vagrant a následně zde spustit příkaz vagrant up a začné celý proces stahování obrazu virtuálního stroje se systémem Ubuntu 12.04.2 LTS (Precise Pangolin). Po jeho stažení se spustí provisioning, který aktualizuje dostupné balíčky systému na virtuálním stroji, následně nainstaluje a nakonfiguruje webový server Apache, PHP, databázový systém MySQL, PostgreSQL a MongoDb a nástroj na profilování výkonu PHP aplikací XHprof spolu s grafickým výstupem XhGui. Proces instalace a konfigurace je časově náročný v závislosti na rychlosti internetu potřebného pro instalaci jednotlivých balíčků ale obvykle do 10 minut by měl být připraven.

Toto prostředí je nastaveno tak, že ve složce ./vagrant/www hledá složku požadovaného projektu a její obsah případně zpracuje. Pokud tedy programátor zadá v prohlížeči http://example.com.loc a má-li nastaven příslušný záznam v /etc/hosts, přebere požadavek virtuální stroj, ten jej předá webovému serveru Apache, který se podívá do složky ./vagrant/www/example a zobrazí její obsah. Document root je nastaven na podsložku www ve složce projektu, dle doporučené adresářové struktury Nette frameworku. V praxi se tak zobrazí soubor ./vagrant/www/example/www/index.html.

Pokud se do adresy prohlížeče přidá přípona ?_profile=1, aktivuje se xhprofiler a každý následující krok se bude profilovat a výsledek ukládat do databáze. Výsledky profilingu jsou dostupné na adrese http://xhgui.loc. Vypnutí profilingu je analogicky přidáním přípony ?_profile=0 do prohlížeče.

Pokud by programátor potřeboval specifické nastavení webového projektu, stačí přidat konfiguraci do adresáře ./vagrant/stuff/puppet/manifests/vhosts. Inspirovat se lze ze souborů v tomto adresáři obsažených.