Zum Inhalt

Vagrant – Multi Machine Setup

In meinem Artikel Vagrant und Ansible – von der Basebox zur fertigen VM Pt. II habe ich euch ja bereits den Grundaufbau eines Vagrantfile gezeigt und wie ihr eine virtuelle Maschine mit Vagrant erstellen könnt.

Wenn es nun ein etwas ausgefalleneres Projekt sein soll, ihr beispielsweise einen Webserver und einen Datenbankserver via Vagrant initialisieren wollt, dann zeige ich euch jetzt, wie ihr die Grundvoraussetzungen mit Vagrant dafür schaffen könnt.

Auf die Grundzüge des Vagrantfile gehe ich nicht nochmal ein, dazu könnt ihr euch einfach den oben verlinkten Artikel durchlesen. Den Punkt des „Vagrant init“ überspringen wir an dieser Stelle, da uns das hier nicht weiter hilft.

Steigen wir also direkt ein – so sieht ein funktionierendes Vagrantfile in einer Multi Machine Umgebung aus

# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  config.vm.define "Webserver" do |web|
    web.vm.box = "debian/jessie64"
    web.vm.hostname = 'webserver'
    web.vm.box_url = "debian/jessie64"
    web.vm.network :private_network, ip: "192.168.33.200"

    web.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "webserver"]
      v.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end

  config.vm.define "Database" do |db|
    db.vm.box = "centos/7"
    db.vm.hostname = 'database'
    db.vm.box_url = "centos/7"
    db.vm.network :private_network, ip: "192.168.33.201"

    db.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "dbserver"]
      v.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end

end

Gehen wir das Vagrantfile Schritt für Schritt durch.

Vagrant.configure("2") do |config|

Hier beginnt die eigentliche Initialisierung – soweit so gut und auch aus dem „normalen“ Vagrantfile bereits bekannt.

  config.vm.define "Webserver" do |web|
    web.vm.box = "debian/jessie64"
    web.vm.hostname = 'webserver'
    web.vm.box_url = "debian/jessie64"
    web.vm.network :private_network, ip: "192.168.33.200"

    web.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "webserver"]
      v.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end

Mit config.vm.define "Webserver" do |web| definieren wir eine VM mit Namen „Webserver“ und geben dieser den Tag „web“. Anhand dieses „Tags“ werden nun die weiteren Parameter definiert. Über web.vm.box = "debian/jessie64" übergeben wir die zu verwendende BaseBox an Vagrant, mit web.vm.hostname = 'webserver' manipulieren wir den Hostnamen der VM und geben die Box URL mit web.vm.box_url = "debian/jessie64" an. In diesem Beispiel befindet sich die virtuelle Maschine in einem privaten Netzwerk, welches vom Host aus erreichbar ist, mit der IP Adresse 192.168.33.200 web.vm.network :private_network, ip: "192.168.33.200"

Mit den folgenden Parametern kann man die virtuelle Maschine nun noch weiter anpassen. Ich nutze dabei, wie gehabt, VirtualBox als Provider, da es für jede Plattform kostenlos zu beziehen ist und sehr vielseitig ist.

    web.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "webserver"]
      v.customize ["modifyvm", :id, "--cpus", "2"]
    end

Aus der ersten Zeile geht bereits hervor, dass als Provider Virtualbox genutzt werden soll und man sich auf den Tag „db“ bezieht db.vm.provider :virtualbox do |v|. Alle weiteren Parameter werden in den nachfolgenden Zeilen festgezurrt. Dazu zählen Punkte wie der Speicher v.customize ["modifyvm", :id, "--memory", 512] und beispielsweise die Anzahl der CPU-Kerne v.customize ["modifyvm", :id, "--cpus", "2"].

Die zweite virtuelle Maschine definieren wir via:

  config.vm.define "Database" do |db|
    db.vm.box = "centos/7"
    db.vm.hostname = 'database'
    db.vm.box_url = "centos/7"
    db.vm.network :private_network, ip: "192.168.33.201"

    db.vm.provider :virtualbox do |v|
      v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
      v.customize ["modifyvm", :id, "--memory", 512]
      v.customize ["modifyvm", :id, "--name", "dbserver"]
      v.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end

Zu erkennen ist, dass wir für die zweite VM eine andere BaseBox nutzen, in diesem Fall nun CentOS 7 anstelle von Debian Jessie.

Nach einem erfolgreichen vagrant up kann man sich nun mit vagrant status vergewissern, dass beide Maschinen laufen:

$ vagrant status
Current machine states:

Webserver                 running (virtualbox)
Database                  running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

Via vagrant ssh "hostname" können wir uns nun mit der jeweiligen Maschine verbinden.

Wozu aber nun das Ganze?

Einerseits kann man damit ein Setup wie das oben gezeigte fahren, wobei man also einen Webserver und einen separaten Datenbankserver installiert oder man nutzt es um beispielsweise selbst geschriebene Ansible Rollen in verschiedenen Umgebungen zu testen.

Viel Spaß damit!

Published inAllgemein

Schreibe den ersten Kommentar

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.