Einführung in Vagrant und wie es als lokale Entwicklungsumgebung verwendet werden kann.
Präsentation von März 2015.
Themen: Vagrant CLI, vagrant share, Provider, Boxes, Provisioning, Netzwerk, Synced Folders, Multi-Maschine Setup, Vergleich mit Docker
4. Probleme
● stundenlanges Einrichten bei jedem Entwickler
● unterschiedliche Platformen (Linux, Mac)
● Konflikte mit Unterschiedlichen
Paketversionen (z.B. PHP 5.3 und 5.4)
● Port-Kollisions (z.B. Apache und Nginx)
● OS neu aufsetzen => alles von vorn einrichten
● “works on my machine” Ausrede
● usw.
4
5. ● Easy-to-use Workflow
● Fokus auf Automatisierung
● Plattformunabhängig: Linux, Mac, Windows
● steigert Development/Production Parität
● komplette Konfiguration in einer Text-Datei:
Vagrantfile
Tool zur Erstellung von vollständigen
Entwicklungsumgebungen
5
7. ● Januar 2010 gestartet
● side-project von Mitchell Hashimoto
● November 2012 Gründung HashiCorp
● aktuell 9 feste Entwickler
● weitere Tools von HashiCorp:
○ Packer, Serf, Consul, Terraform, Atlas
“Building tools for the software managed datacenter.”
Die Macher
7
8. ● Entwicklungsumgebung
für Software Entwicklung
○ gleiche Umgebung für alle Team-Mitglieder
○ platformunabhängig
○ portabel
○ isoliert
○ eigene IDEs, Browser und Debugger
trotzdem weiterhin nutzbar
○ quasi unsichtbar
Einsatzwecke
8
9. ● Entwicklung + Testing von Deployments
○ Provisioning per Shell, Ansible, Chef, Puppet, Salt, etc.
○ lokal
■ VirtualBox, VMware, Parallels, Hyper-V, Docker,
QEMU/KVM, etc.
○ remote
■ AWS, RackSpace, DigitalOcean, OpenStack, etc.
Einsatzwecke
9
10. ● Sandboxing
○ z.B. neue Programme testen, ohne das eigene System
zu verunreinigen
Einsatzwecke
10
16. Typischer Workflow
$ vagrant up # morgens
… work it harder … make it better … do it faster …
$ vagrant suspend/halt # feierabend
Entwicklung an Projekt X
16
17. Weitere CLI Befehle
● vagrant status → Zustand der VM
● vagrant global-status → Zustand aller VMs
● vagrant ssh → SSH Zugriff auf VM
● vagrant reload → Neustart
17
19. mehr muss man nicht wissen,
um bei Vagrant gestützten
Projekten mitzuentwickeln
19
aber es gibt noch so viel mehr zu entdecken …
20. Vagrant Share Feature
● aktuelle VM temporär öffentlich teilen
○ HTTP Zugriff über öffentliche URL
■ z.B. für bleeding-edge Preview
○ SSH Zugriff von überall
■ z.B. für Pair-Programming, Debugging, etc.
○ Verbindung zu VM als wäre sie lokal
■ Zugriff auf alle freigegebenen Ports der VM
20
24. ● beschreibt
○ die Art der Machine
○ wie sie konfiguriert und eingerichtet werden soll
● Ruby Syntax
○ aber keine Ruby Kenntnisse nötig!
● überlicherweise im VCS Repository
Vagrantfile
24
29. Boxes
● besitzen meist vorinstalliertes OS
○ z.B. Ubuntu, Debian, CentOS, Fedora, CoreOS,
Windows, etc.
● i.d.R. relativ “leer”, gibt aber auch
komplette Stacks (LAMP, Python, etc.)
29
Vagrant.configure("2") do |config|
config.vm.box = “ubuntu/trusty64”
end
● Box = Name für Images verschied. Provider
32. Provisioning Beispiele
32
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update && sudo apt-get install -y apache2
echo "hello world" > /var/www/index.html
SHELL
end
Vagrant.configure("2") do |config|
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "my_manifests"
puppet.manifest_file = "default.pp"
end
end
Vagrant.configure("2") do |config|
config.vm.provision "shell",
path: “https://raw.githubusercontent.com/tbal/prjx/master/init.sh”
end
33. Netzwerk
● Port Forwarding
○ Zugriff nur vom Host selbst möglich
○ Aufruf z.B. per http://localhost:8080
33
Vagrant.configure("2") do |config|
config.vm.network "forwarded_port", guest: 80, host: 8080
end
34. Netzwerk
● Private Network
○ Zugriff nur vom Host selbst möglich
○ Aufruf z.B. per http://192.168.33.10/
■ wenn in /etc/hosts eingetragen
z.B. per http://myproject.dev/
34
Vagrant.configure("2") do |config|
config.vm.network "private_network", type: "dhcp"
end
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.50.4"
end
35. Netzwerk
● Public Network (bridged)
○ öffentlicher Zugriff
○ per Netzwerk-Interface Basis
○ Aufruf z.B. per http://192.168.33.10/
■ wenn in /etc/hosts eingetragen
z.B. per http://myproject.dev/
35
Vagrant.configure("2") do |config|
config.vm.network "public_network"
end
Vagrant.configure("2") do |config|
config.vm.network "public_network", ip: "192.168.50.4"
end
36. Synced Folders
● Austausch von Daten zwischen Host und Gast
36
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/var/www/website"
end
● Standardmäßig wird
Projektverzeichnis auf dem Host
nach /vagrant in dem Gast “gemountet”
37. Synced Folders
● verschiedene “Treiber” verfügbar
○ NFS, SMB (cifs), rsync, sshfs, etc.
37
Vagrant.configure("2") do |config|
config.vm.synced_folder "src/", "/var/www/website", type: “<type>”
end
● Standard, wenn kein Typ angegeben:
○ eigener Mechanismus von Provider
(VirtualBox/VMware/…)
38. Multi-Machine Setup
38
● Modellierung einer Multi-Server Umgebung
● Disaster-case testing: Ausfall einer Machine
● Interface testing: API zu Service Komponente
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: "echo Hello"
config.vm.define "web" do |web|
web.vm.box = "apache"
end
config.vm.define "db" do |db|
db.vm.box = "mysql"
end
end
39. Plugins
● sehr mächtig
● Großteil des Cores selbst als Plugins integriert
$ vagrant plugin install/uninstall <plugin-name>
$ vagrant plugin list
$ vagrant plugin update [<plugin-name>]
39
● Nennenswerte Plugins:
○ vagrant-hostsupdater, vagrant-libvirt,
vagrant-sahara, vagrant-vbox-snapshot,
vagrant-cachier