Testserver einrichten mit Vagrant – Provisioning

Testserver einrichten mit Vagrant – Provisioning

Im letzten Beitrag zum Einrichten eines lokalen Testservers war ich am Ende so weit, dass die nur mit Ubuntu als Betriebssystem ausgestattete, virtuelle Maschine erfolgreich gestartet werden konnte.

In diesem Beitrag dreht sich nun alles um die Konfiguration und das einrichten der virtuellen Maschine, dem sogenannten Provisioning.

Konfiguration der virtuellen Maschine

Ändert man die Standardwerte, die durch

vagrant init ubuntu/trusty64

ins Vagrantfile geschrieben werden, nicht, so werden dieser Maschine 512 MB Hauptspeicher und 40GB Massenspeicher zugewiesen.

Als gemeinsamer Ordner wird der aktuelle Ordner verwendet. Dieser Ordner ist voll transient. Das heißt, dass sämtliche Änderungen in Files dieses Ordners samt Unterordnern in der virtuellen Maschine als auch am Host-PC „durchgereicht“ werden.

Wichtig: will man einen dieser Werte ändern, macht es wenig Sinn, das über den VirtualBox Manager zu tun! Sämtliche Änderungen gehen nach einem Neustart der virtuellen Maschine wieder verloren. Grund: um die Maschine zu starten, wird immer das Vagrantfile zur Konfiguration verwendet. Genau das ist ja Sinn der Sache: anhand eines Konfigurationsfiles beim Starten der virtuellen Maschine immer exakt die gleiche Konfiguration vor sich zu haben.

Provisioning

Nach dem Neuanlegen einer virtuellen Maschine findest du auf dieser erst einmal nur ein Betriebssystem, sofern du keine vorgefertigte „Box“ wie z.B. Homestead installiert hast. Das ist also mehr oder weniger so, als ob du einen neuen Computer gekauft hättest.

Provisioning heißt nun, alle Applikationen zu installieren und auch alle zum Ausführen deiner Webapplikation notwendigen Daten, wie z.B. ein Datenbank Backup / Testdaten einzuspielen.

Hardcore per Shell Script

Man kann das anhand eines Shellscripts tun, was ich persönlich nur jenen empfehlen würde, die sich bereits mit Linux gut auskennen. Tut man das nicht, so darf man sich zum Start auch noch mit der Linux Shell auseinandersetzen. Kein No-Go, aber eine (kleine) Hürde mehr.

Und neben Linux-Kenntnissen sollte man auch noch Kenntnisse über Apache Serverkonfiguration mitbringen. Für den Einstieg doch eher heftig.

Provisioning Systeme

Vagrant unterstützt auch sogenannte Provisioning Systeme, unter anderem Puppet,  Chef oder Docker. Diese helfen dabei, Applikationen so einfach als möglich auf dem Zielsystem zu installieren, ohne sich mit der Linux Shell oder der Apache Serverkonfiguration auseinandersetzen zu müssen.

Ich habe mich für einen ersten Test für Puppet entschieden, weil ich dazu auf Anhieb auf entsprechende Anleitungen gestoßen bin.

Puppet

Das sogenannte Puppet-Manifest zu verstehen und zu erstellen, kostet einiges an Lernaufwand. Hilfreich für einen ersten Start mit Vagrant und Puppet sind die Beispiele von Patrick Lee. Diese beginnen sehr einfach, beinhalten am Ende aber auch komplexere Konfigurationen, wie zum Beispiel das Provisioning einer Seite für die Amazon Web Services.

Man bekommt anhand dieser Beispiele ein allererstes Gefühl und kann sich dann tiefer in das Thema einarbeiten, um seine eigene Konfiguration auf die Beine zu stellen.

Eine andere Möglichkeit zum Erstellen des Vagrantfile und des Puppet Manifests gibt es mit der grafischen Benutzeroberfläche von PuPHPet.

PuPHPet – Entwicklungsumgebung per Mausklick

Wenn man „grafische Benutzeroberfläche“ liest – denn so wird PuPHPet beworben – dann hat man bestimmte Vorstellungen, was das bedeutet. Im konkreten Fall von PuPHPet heißt das, dass man über eine Weboberfläche in Form mehrerer Formulare seine Entwicklungsumgebung definiert.

Screenshot von PuPHPet
Screenshot von PuPHPet

Sehr hilfreich bei PuPHPet ist, dass es zu jedem Eingabefeld eine entsprechende Popup Hilfe gibt – zumeist auch mit Links zu einer ausführlicheren Beschreibung. Woran man aber nicht vorbeikommt: man muss schon wissen, was man tut und was man wo und wie definieren muss.

Bei den Angaben zu PHP und MySQL ist es natürlich sinnvoll, die gleichen Versionen zu verwenden, die man im Web verwendet. Also zuerst beim Provider nachsehen, welche Versionen dort laufen und diese dann entsprechend angeben! Bei der Definition der Daten zu MySQL kann man auch angeben, welche Datenbanken man erstellen will und welche Daten man in diese importieren will.

Kleiner Ausflug – MariaDB vs. MySQL

PuPHPet schlägt per default MariaDB vor und nicht MySQL. Zwar ist das für mich nicht relevant (eXperinox läuft bei einem WebProvider der bisher nur MySQL anbietet), aber wer Näheres zu MariaDB vs. MySQL wissen will, dem empfehle ich folgenden Blog-Beitrag:  MariaDB vs. MySQL – Vorteile und Nachteile im Überblick.

ZIP-File herunterladen

Nachdem man alle Daten angegeben hat, lädt man ein ZIP File herunter, welches sämtliche Einstellungen als Vagrantfile und Puppet-Manifest enthält.

Das ZIP-File muss man dann nur noch entpacken und mit

vagrant up

die fertig aufgesetzte Maschine starten. Okay, fast!

Hosts File

Wenn man zum ersten Mal eine virtuelle Maschine für ein Projekt zusammenstellt, so darf man nicht vergessen, die angegebene IP-Adresse unter dem PuPHPet Deploy Target in das hosts File einzutragen. Dieses befindet sich bei Windows unter

C:\Windows\System32\drivers\etc\hosts

Dort trägt man die IP-Adresse entsprechend ein, z.B.:

172.16.0.100      experinox.local

Achtung: den Editor muss man als Admin starten, sonst kann man das File dann nicht speichern!

Nach dem Starten der virtuellen Maschine kann man diese dann unter eben dieser IP-Adresse oder durch http://experinox.local/ im Browser ansurfen.

Grmbl. Hmpf $%&$$!!$!

Aha, „awesome“ in Zusammenhang mit einer Fehlkonfiguration.

Ich habe an dieser Stelle beschlossen, die von PuPHPet erstellte Konfiguration als Basis zu verwenden und mich  nun näher in Vagrant und Puppet einzulesen. Es ist zwar nett, wenn ein Tool alles vollautomatisch erstellt und verspricht, dass man sich nicht um Details kümmern muss, aber sobald es Fehler gibt, ist es vorbei mit dem „sich nicht kümmern müssen“.

Ab sofort werde ich also in den automatisch erzeugten Files von PuPHPet direkt Hand anlegen.

Nach jeder Korrektur im Provisioning muss man seine Änderungen anhand von

vagrant provision

der virtuellen Maschine bekanntmachen.

Obiger Fehler sagt klar, dass an der Einstellung der virtuellen Hosts etwas nicht in Ordnung ist.

Fehler, die mich sonst noch geplagt haben

Nachdem der obige Fehler mit dem virtuellen Host am Bildschirm aufgetaucht ist, habe ich mir zuerst die Ausgaben auf der Kommandozeile etwas näher angesehen, nachdem ich vagrant up ausgeführt habe.

Pfuh. Ganz schön heftig, was da so alles zu lesen und zu behirnen ist! Vieles ist reine Information, aber dazwischen tauchen auch Zeilen auf, die evtl. auf Fehler hinweisen könnten.

Diese will ich nun allesamt anführen. Evtl. stolpert der ein oder die andere genau über diese und ist froh, an dieser Stelle eine Lösung zu finden.

Stderr: VBoxManage.exe: error: Could not rename the directory

Nach dem Versuch, mit vagrant up die Maschine nach Änderungen in der Konfiguration erneut zu starten, kam obiger Fehler. Eine Abhilfe findet man hier. Ich habe in Config.yaml unter machines den hostname entfernt. Warum? Weil ich in der Dokumentation von Vagrant gelesen habe, dass default dieser Wert nicht gesetzt wird. Was bedeutet, dass das nicht zwingend notwendig ist. Nach Entfernen des Hostnamens gab es obige Fehlermeldung nicht mehr.

Wichtig: die Kommandozeile immer als Administrator starten! Der Fehler mit dem Umbenennen hat nämlich auch mit Rechten zu tun. Wenn man eine virtuelle Maschine zuerst als Admin startet und später als „normaler“ Benutzer, hat man unter anderem auch keine Rechte, diese umzubenennen.

Unmet dependencies – php5-intl

The following packages have unmet dependencies:
==> eXperinox_5.4:  php5-intl : Depends: libicu48 (>= 4.8-1) but it is not installable
==> eXperinox_5.4: E: Unable to correct problems, you have held broken packages.

Meine simple, erste Lösung: php5-intl aus der Modulliste von PHP entfernen. Neben cli ist intl nämlich eines von zwei vordefinierten Modulen, die in PuPHPet angegeben werden.

vHost und Internal Server Error

Nachdem ich den Virtual Host in der Konfiguration ergänzt habe, kam ein Internal Server Error. Das hat mich anfangs zeitweise wirklich gefrustet.

An dieser Stelle kommt die Erkenntnis, dass Provisioning-Tools wie Puppet oder PuPHPet durchaus ein sehr guter Start für das Provisioning sein können, aber man im Falle des Falles sich doch in die Tiefen der Server-Konfiguration begeben muss.

Im konkreten Fall bin ich mit Hilfe von Putty in die virtuelle Maschine eingestiegen und habe mir das entsprechende Apache Error-Log angesehen.

cat /var/log/apache2/av_xwvu0a9k79av_error.log

Der schräge Name des Log-Files kommt daher, dass PuPHPet zufällige ID’s für Virtual Hosts generiert. Und im Log-File finde ich das Folgende:

/var/www/experinox/.htaccess: Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration

Zu Testzwecken habe ich lokal via .htaccess das Memory-Limit herabgesetzt und genau das hat zum Internal Server Error geführt. Ich habe php_value und php_flag der Einfachheit halber aus der .htaccess entfernt und voila – der Internal Server Error ist Geschichte.

Tipp an dieser Stelle also: wenn man nach dem Aufsetzen einer virtuellen Maschine einen Internal Server Error bekommt, dann einen Blick ins Apache-Log werfen!

Letzter Schritt – Datenbankzugriff vom Host

Als letzten Schritt der Konfiguration von eXperinox in einer virtuellen Maschine ist nun noch der Zugriff auf die MySQL Datenbank vom Host aus zu konfigurieren.

Mein Lieblingstool, um mit MySQL Datenbanken zu arbeiten, ist HeidiSQL. Um mit HeidSQL auf die Datenbank in der virtuellen Maschine zugreifen zu können, sind folgende Einstellungen vorzunehmen:

HeidiSQL - Verbindung zur Datenbank im Gastsystem
HeidiSQL – Verbindung zur Datenbank im Gastsystem

Als Verbindungstyp MySQL (SSH tunnel) auswählen.

Wichtig: prüfen, ob die bind-address in

/etc/mysql/my.cnf

korrekt eingestellt ist. Hier muss 127.0.0.1 stehen.  Diese IP ist dann auch unter Hostname / IP einzutragen. Benutzername und Passwort eintragen, wie man sie im Vagrantfile (bzw. Config.yaml bei Verwendung von PuPHPet) eingetragen hat. Als Port 3306 stehen lassen.

Im SSH Tunnel Tab sind folgende Einstellungen zu machen:

  • als SSH Host jene IP eintragen, die man für die virtuelle Maschine definiert hat (jene, die man auch in hosts eintragen musste)
  • Port: 22
  • Benutzername: vagrant
  • Private key Datei auswählen, zu finden in puphpet\files\dot\ssh\id_rsa.ppk
  • Sollte man plink.exe noch nicht auf dem PC haben, so kann man es hier herunterladen
HeidiSQL - SSH Tunnel Einstellungen
HeidiSQL – SSH Tunnel Einstellungen

Verbindung speichern und schon kann man sich zur Datenbank in der virtuellen Maschine verbinden.

eXperinox in der virtuellen Maschine ausführen

Nach dem Einfügen der Daten aus den Online-Datenbanken (dank HeidiSQL ein Kinderspiel) kommt der große Test.

Netbeans starten und eXperinox ansurfen. Wenn alles gut geht, dann startet eXperinox im Browser samt xDebug Debugger. Und voila – es tut 🙂 .

Der große Vorteil von Vagrant

Jeder Entwickler im Projekt kann anhand des Vagrant-Files, welches sämtliche Informationen enthält, um die virtuelle Maschine in der entsprechenden Konfiguration zu starten, auf einfache Art und Weise die exakt gleiche Entwicklungsumgebung auf seinem lokalen PC erzeugen.

Im Falle einer neuen PHP Version muss nur ein Team-Mitglied das Vagrant File entsprechend anpassen und schon können alle anderen ebenfalls diese neue Konfiguration verwenden.

Ein Gedanke zu „Testserver einrichten mit Vagrant – Provisioning“

  1. Guter Tipp bei Vagrant ist auch noch anstelle der Default Verbindung zum host auf NFS zu wechseln.

    nfs_setting = RUBY_PLATFORM =~ /darwin/ || RUBY_PLATFORM =~ /linux/ || Vagrant.has_plugin?(„vagrant-winnfsd“)
    config.vm.synced_folder „./“, „/var/www/experinox“, :nfs => nfs_setting

    dafür muss unter windows allerdings das plugin vagrant-winnfsd installiert sein.

Schreibe einen Kommentar

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