Ü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:

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

  1. Starten Sie eine Shell (a.k.a. Kommandozeile oder Terminal).
  2. 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. mit cd ~/workspace/webservices/vagrant-single.
  3. Legen Sie das Vagrantfile mit der passenden Box 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.

  4. Starten Sie die VM mit vagrant up --provider vmware_desktop.
  5. Verbinden Sie sich zur VM per SSH: vagrant ssh.
  6. Überprüfen Sie das Alter der VM mit dem Befehl uptime.
  7. Verlassen Sie die VM mit exit.
  8. Löschen Sie die VM mit vagrant destroy -f.

Fehlermeldungen

  • VirtualBox kann nicht gestartet werden?
    1. Starten Sie den Rechner neu, um möglicherweise noch bestehende VirtualBox-Prozesse zu beenden.
    2. 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

  1. Welche IP-Adresse hat die VM erhalten?

  2. Warum ist die neue Virtuelle Maschine per SSH erreichbar?

  3. Welche Änderung erwarten Sie in dem Verzeichnis, in dem sich das Vagrantfile befindet, nachdem Sie in der VM den Befehl touch /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:

Three-tier Architecture

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

  1. 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. mit cd ~/workspace/webservices/vagrant-multi.
  2. Legen Sie das Vagrantfile an (siehe Beispiel oben).
  3. 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.
  4. Wenden Sie die Änderungen an mit vagrant provision.
  5. Überprüfen Sie die Netzwerkeinstellungen:
    1. 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).
    2. 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).
  6. Ändern Sie das Vagrantfile und fügen Sie einen shell-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
  7. 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()).
  8. 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.
  9. Ü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
    
  10. 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 Sie vagrant 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:

    1. Starten Sie den Rechner neu, damit alle VMs gestoppt sind.
    2. Löschen Sie die VirtualBox-Konfiguration mit rm -rf ~/.config/VirtualBox ~/.vagrant.d
    3. Löschen Sie das .vagrant Verzeichnis der Übung
    4. Starten Sie die VM (siehe Beginn der Übung)

Fragen zur Kontrolle

  1. 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?

  2. 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

  1. Löschen Sie die erstellten VMs und deren virtuelle Festplatten mit dem folgenden Kommando:

    $ vagrant destroy -f
    
  2. Ü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.
letzte Änderung: 12. Dezember 2023