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.

vagrant-945x400

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.