Übung: Vagrant
Virtuelle Maschine mit Vagrant erstellen
Ziel der Übung ist es, eine einzelne virtuelle Maschine mit Hilfe von vagrant
zu erstellen und anzupassen.
Vorbereitung
Prüfen Sie mit dem Befehl quota
, ob Sie genügend Speicherplatz zur Verfügung haben. Für den Kurs sollten Sie mindestens 1 GiB
freien Platz haben.
vagrant
installieren
Auf den Pool-Rechnern im Linux-Labor ist alle notwendige Software bereits installiert.
Falls Sie auf Ihrem eigenen Rechner arbeiten, müssen Sie als Vagrant und VMware installieren:
-
MacOS:
$ brew install vagrant vmware-fusion vagrant-vmware-utility
Außerdem benötigen Sie eine (kostenlose) Lizenz für VMware Fusion Player.
-
Linux und Windows:
Installieren Sie Vagrant sowie den VMware Workstation Player.
Zusätzlich installieren Sie bite das “Vagrant VMware provider plugin”:
$ vagrant plugin install vagrant-vmware-desktop
Überprüfen Sie jetzt die erfolgreiche Installation. Es sollte eine Ausgabe ähnlich der folgenden erscheinen:
$ vagrant version
Installed Version: B.C.D
...
Weitere Details können Sie der Installationsanleitung entnehmen.
Anleitung
- Starten Sie eine Shell (a.k.a. Kommandozeile oder Terminal).
- Erstellen Sie ein neues Verzeichnis für dieses Lab, z.B. mit
mkdir -p ~/workspace/webservices/vagrant-single
und wechseln Sie in das eben erstellte Verzeichnis, z.B. mitcd ~/workspace/webservices/vagrant-single
. -
Legen Sie das
Vagrantfile
mit der passendenBox
an:$ vagrant init ubuntu/jammy64
Falls Sie nicht im Linux-Labor arbeiten, müssen Sie eine
Box
für Ihre Kombination aus CPU-Architektur und Provider suchen (z.B. für den M1 Mac oder AMD64 Windows oder für Windows bento/ubuntu-22.04).Verwenden Sie im Zweifel die neueste verfügbare Ubuntu LTS-Version.
- Starten Sie die VM mit
vagrant up --provider vmware_desktop
. - Verbinden Sie sich zur VM per SSH:
vagrant ssh
. - Überprüfen Sie das Alter der VM mit dem Befehl
uptime
. - Verlassen Sie die VM mit
exit
. - Löschen Sie die VM mit
vagrant destroy -f
.
Fehlermeldungen
- VirtualBox kann nicht gestartet werden?
- Starten Sie den Rechner neu, um möglicherweise noch bestehende VirtualBox-Prozesse zu beenden.
-
Löschen Sie die zu VirtualBox und Vagrant gehörenden Dateien mit
rm -rf ~/.config/VirtualBox ~/.vagrant.d find ~/workspace -name .vagrant -type d -exec rm -rf {} \;
- VMware Fehlermeldungen? Folgen Sie den Vorschlägen in er Konsole zur Installation von zusätzlichen Plugins / Helpern. Scheinbar ist die Installationsanleitung von Vagrant nicht 100% komplett.
Fragen zur Kontrolle
-
Welche IP-Adresse hat die VM erhalten?
-
Warum ist die neue Virtuelle Maschine per SSH erreichbar?
-
Welche Änderung erwarten Sie in dem Verzeichnis, in dem sich das
Vagrantfile
befindet, nachdem Sie in der VM den Befehltouch /vagrant/hello
ausführen?
Verbund aus mehreren VMs
In dieser Übung sollen Sie einen Verbund aus mehreren VMs erstellen, wie er für eine klassische three-tier web application (bestehend aus Load-Balancer, Web Server und Datenbank) typisch ist:
Source Code
Vagrant.configure('2') do |config|
config.vm.box = "gyptazy/ubuntu22.04-arm64"
# Load-Balancer VM
config.vm.define 'lb' do |lb|
# Privates Netzwerk konfigurieren
lb.vm.network 'private_network', ip: 'TODO'
# TODO Load Balancer 'haproxy' installieren
# TODO Load Balancer konfigurieren für web0, web1
end
# Web-Server VM #1
config.vm.define 'web0' do |web|
# TODO Privates Netzwerk konfigurieren
web.vm.network 'private_network', ip: 'TODO'
# TODO App-Server 'nodejs' installieren
# TODO Verbindung zur Datenbank konfigurieren
# TODO App starten
end
# Web-Server VM #2
config.vm.define 'web1' do |web|
# TODO Privates Netzwerk konfigurieren
web.vm.network 'private_network', ip: 'TODO'
# TODO App-Server 'nodejs' installieren
# TODO Verbindung zur Datenbank konfigurieren
# TODO App starten
end
# Datenbank VM
config.vm.define 'db' do |db|
# TODO Privates Netzwerk konfigurieren
db.vm.network 'private_network', ip: 'TODO'
# TODO Datenbank 'postgresql' installieren
end
end
Anleitung
- Erstellen Sie ein neues Verzeichnis für dieses Lab, z.B. mit
mkdir -p ~/workspace/webservices/vagrant-multi
und wechseln Sie in das eben erstellte Verzeichnis, z.B. mitcd ~/workspace/webservices/vagrant-multi
. - Legen Sie das
Vagrantfile
an (siehe Beispiel oben). - Konfigurieren Sie im
Vagrantfile
für jede VM die Verbindung zu einem privaten Netzwerk, damit der Load-Balancer mit den Web-Servern sowie die Web-Server mit der Datenbank kommunizieren können. - Wenden Sie die Änderungen an mit
vagrant provision
. - Überprüfen Sie die Netzwerkeinstellungen:
- Melden Sie sich auf dem Web-Server an (
vagrant ssh web1
) und notieren Sie die IP-Adresse der VM (ip addr show dev eth1
). Das Resultat sollte im Bereich 172.16.0.0 - 172.31.255.255 liegen (172.16/12 prefix). - Melden Sie sich auf dem Load-Balancer an (
vagrant ssh lb
) und prüfen Sie die Erreichbarkeit der beiden Web-Server, indem Sie die eben ermittelte IP-Adresse pingen (ping 172.x.y.z
).
- Melden Sie sich auf dem Web-Server an (
-
Ändern Sie das
Vagrantfile
und fügen Sie einenshell
-Provisioner hinzu, der die folgenden Software-Pakete (entsprechend der Rolle der VM) installiert:VM Paket lb haproxy web-1 ruby web-2 ruby db postgresql - Legen Sie eine einfache node.js- oder Ruby-Anwendung an (
Hello World
reicht aus) und starten sie diese auf beiden Web-Servern. Geben Sie auf jedem Host einen anderen String zurück, so dass Sie später leicht unterscheiden können, zu welchem der beiden Web-Server der Request gerouted wurde (z.B.os.hostname()
). - Konfigurieren Sie HAProxy, so dass er die eingehenden Requests gleichmäßig auf beide Web-Server verteilt. Passen Sie insbesondere in
/etc/haproxy/haproxy.cfg
die IP-Adressen und Ports der Web-Server (auf denen die node.js-Anwendung läuft) an. - Überprüfen Sie von Ihrer Workstation aus, dass der Load-Balancer die Requests auf beide Web-Server verteilt:
$ curl 172.28.128.7 Hello from web0 $ curl 172.28.128.7 Hello from web1
- Erweitern Sie die Anwendung, so dass sie statt einem statischen String Einträge aus der Datenbank liest und zurückgibt.
Fehlermeldungen
-
Dateien auf dem Node in
/vagrant
nicht aktuell? Rufen Sievagrant rsync
auf, um eine Synchronisation zu erzwingen. -
Falls die VM der zweiten Übung nicht startet, haben Sie eventuell das Verzeichnis der vorherigen Übung wiederverwendet, ohne die VMs mit
vagrant destroy
vorher zu löschen. Beide Übungen müssen aber in getrennten Verzeichnissen ausgeführt werden.Abhilfe:
- Starten Sie den Rechner neu, damit alle VMs gestoppt sind.
- Löschen Sie die VirtualBox-Konfiguration mit
rm -rf ~/.config/VirtualBox ~/.vagrant.d
- Löschen Sie das
.vagrant
Verzeichnis der Übung - Starten Sie die VM (siehe Beginn der Übung)
Fragen zur Kontrolle
-
Die IP-Adressen im privaten Netzwerk werden von Vagrant (VirtualBox) zufällig vergeben. Wie können Sie sicherstellen, dass der Load-Balancer die richtigen Adressen der Web-Server verwendet?
-
In der vorliegenden Form muss einige Konfiguration manuell erfolgen. Wie könnte man den Load-Balancer konfigurieren, so dass er die Adressen und Ports der Web-Server kennt? Gleiches gilt für die Web-Server - wie erfahren diese, welche IP-Adresse und Port der Datenbank-Server verwenden?
Literatur
Aufräumen
-
Löschen Sie die erstellten VMs und deren virtuelle Festplatten mit dem folgenden Kommando:
$ vagrant destroy -f
-
Überprüfen Sie, dass keine VM mehr existiert:
$ vagrant status Current machine states: default not created (virtualbox)
Sie können die Überprüfung auch in der GUI ausführen;
virtualbox
sollte keine VMs anzeigen.
Hinweise Linux-Labor
- Nur dieser Kurs darf VirtualBox im Rahmen der Vorlesung “Web Services” benutzen. Ihre Quota wurde dafür angehoben und wird nach Abschluss des Kurses wieder auf den Standard-Wert zurückfallen.
- Die virtuellen Festplatten werden sehr groß und sind jederzeit durch Ihren Quellcode reproduzierbar, so dass sie nicht im Backup enthalten sind. Stellen Sie sicher, dass Sie ihren Quellcode (
Vagrantfile
etc.) auf Ihrem persönlichen Laufwerk halten, wo es dem Backup unterliegt. - Die virtuellen Festplatten müssen nach Abschluss des Kurses gelöscht werden.
- In VirtualBox dürfen nur NAT-Netzwerkkarten benutzt werden.
Vagrant
macht das von sich aus; diese Einstellung darf nicht verändert werden.