Fedora 22 příchází s celou řadou novinek a jednou z nich je i Vagrant s podporou virtualizace libvirt. Nevíte, k čemu je Vagrant dobrý? Vagrant je program, se kterým si můžete jednoduše vytvořit mezi-platformně přenosné a reprodukovatelné vývojové prostředí pro svůj projekt. Podporuje celou řadu platforem, sdílené složky, přeposílání mezi porty a oblíbené konfigurační nástroje jako Chef, Puppet nebo Ansible. A to ještě není všechno. Vagrant můžete nakonfigurovat i tak, aby používal linuxové kontejnery nebo některé známé služby v cloudu, takže své vývojové prostředí ani nemusíte lokálně virtualizovat.
Proč Vagrant?
Vagrant byl vytvořen s cílem zjednodušit vývoj aplikací v týmu. Umožňuje, aby tým, ve kterém každý běží na jiném operačním systému, mohl jednoduše spolupracovat na týmovém projektu a vyvíjet oproti společné konfiguraci. Vagrant tohoto dosahuje za pomocí virtualizace vývojového prostředí. Projekt tedy běží ve virtuálním stroji, případně kontejneru. Díky tomu může přijít kdykoliv nový člen týmu, stáhnout si repozitář s projektem a v případě, že je k projektu vytvořen tzv. Vagrantfile, virtualizovat vývojové prostředí příkazem vagrant up
. Namísto půl dne nastavování tak nyní stačí jeden příkaz.
To samozřejmě vede k celé řadě výhod i pro vývoj projektů jedním vývojářem. Virtualizace odstiňuje projekt od hostujícího systému, zabraňuje tak konfliktům mezi projekty nebo se systémem a pomáhá k udržení čistého systému bez projektových závislostí. Další nespornou výhodou je možnost vyvíjet oproti produkčnímu prostředí a využít tak pro projekt systém, na kterém ve výsledku poběží (například Red Hat Enterprise Linux).
Instalace
Pro nainstalování Vagrantu bez dalších pluginů zadejte:
# dnf install vagrant
V základu podporuje Vagrant VirtualBox a Docker, oboje si ale musíte doinstalovat zvlášť.
Ve Fedoře je k dispozici i vagrant-libvirt plugin, který Vám umožní využít virtualizaci QEMU/KVM. Protože libvirt ve Fedoře již máme, instalací pluginu se nainstalují i všechny závislosti. Navíc je libvirt provider ve Vagrantu na Fedoře nastavený jako výchozí. Nainstalujte zadáním:
# dnf install vagrant-libvirt
Tip: Pokud nechcete vždycky při pouštění příslušné libvirt domény Vagrantem zadávat administrátorské heslo, můžete si stáhnout podbalík vagrant-libvirt-doc a zkopírovat politiku, která umožní uživatelům ve skupině vagrant pracovat s libvirtem bez hesla:
# dnf install vagrant-libvirt-doc # cp /usr/share/vagrant/gems/doc/vagrant-libvirt-0.0.26/polkit/10-vagrant-libvirt.rules /usr/share/polkit-1/rules.d/
A nakonec, pokud byste rádi použili lxc namísto Dockeru, máme již ve Fedoře zabalený i plugin vagrant-lxc:
# dnf install vagrant-lxc
Všechny zmíněné balíčky byly sestaveny i pro Fedoru 21 a jsou také k dispozici v oficiálních repozitářích. Rozdílem oproti balíčkům publikovaných upstreamovými vývojáři je absence oficiálních pluginů pro nahrávání boxů (obrazů virtuálních strojů) na službu Atlas. Tyto pluginy využívají RubyEncoder, který kvůli licenci nemůžeme do Fedory zahrnout. Stahování boxů však funguje jak má.
Konfigurace
Jak jsem již napsal, každý projekt potřebuje svůj Vagrantfile, což je projektová definice nad některým z boxů. Boxy jsou v podstatě jen zabalené obrazy virtuálních strojů s nějakými metadaty a jejich podoba záleží na provideru. Můžete je sehnat na Atlasu nebo kdekoliv na internetu (Fedora 22 přináší oficiální boxy Fedora Vagrant na stránce ke stáhnutí).
Příklad konfigurace může vypadat třeba takto:
Vagrant.configure(2) do |config| # Název boxu; box musí být lokálně přidán nebo dostupný na Atlasu. config.vm.box = "humaton/fedora-21-cloud" # V opačném případě je vhodně nastavit URL na které se box nachází. # Díky tomu jej bude umět Vagrant automaticky stáhnout. # config.vm.box_url = "" # Přepošleme port z virtuálního stroje na hostující config.vm.network "forwarded_port", guest: 3001, host: 3000 # Nasdílíme svoji složku s daty na /vagrant_data ve virtuálním stroji config.vm.synced_folder "../data", "/vagrant_data" # Jednoduchý provisioning, který nainstaluje Ruby on Rails config.vm.provision "shell", inline: <<-SHELL sudo yum install -y rubygem-rails SHELL end
Kromě explicitního nastavení nastavuje Vagrant i některé věci implicitně. Například nasdílí vaši projektovou složku (.) na /vagrant, abyste mohli upravovat zdrojový kód na svém systému, ale aby byly změny dostupné i na virtuálním stroji.
V momentě, kdy jste se svojí konfigurací spokojeni, stačí jen zadat vagrant up
a počkat až Vagrant odvede svoji práci. Pak můžete otevřít projekt v oblíbeném editoru, vytvořit změny, synchronizovat sdílené složky s vagrant rsync
, přihlásit se do virtuálního stroje díky vagrant ssh
, pustit si v něm vývojový server a pak vyzkoušet, zda na nastaveném portu běží vše jak má.
Ale to je jen jednoduchý příklad, neboť Vagrant vám toho umožní mnohem a mnohem víc. Proto si určitě projdětě oficiální dokumentaci a případně i dokumentaci k pluginu libvirt.
17. 8. 2015 at 10:48
Potřeboval bych poradit, Vagrant+Virtualbox nějak divně řeší cache souboru. Edituji CSS soubor, uložím ho a Virtual z vagrantu mi stále posílá zpět starou verzi, přitom když se na daný soubor kouknu přímo ve vagrantu, je aktualizovaný.
Sobory mi servuje gunicorn, který sice zatím nemá podporu pro sendfile, ale ani restart služby nepomáhá. Jediné co pomůže je vagrant reload, což zorvna není ideální.
17. 8. 2015 at 15:28
Tak to bohužel jen z tohoto popisu neporadím, sám jej nepoužívám. Možná se třeba obrátit na upstream projektu? Tam je VirtualBox preferovaný.
Ale zeptám se, proč nepoužít libvirt+NFS? Třeba s ním problémy nebudou.