Facebook
Instagram
[email protected]
+49 711 21955380

Vagrant – It smells like Linux

by | Feb 2, 2018 | Infrastruktur

Frei nach dem Motto „it’s better to burn out than to fade away“ habe ich mir die vergangenen Nächte mit der Suche nach neuen Technologien im Bereich der lokalen Webentwicklung um die Ohren geschlagen. Nachdem ich XAMPP schon seit Längerem die Treue gekündigt habe und auch AMPPS – nach einem kurzen Aufflackern der Hoffnung, endlich ein geeignetes Tool gefunden zu haben – enttäuschte, durchstöberte ich erneut das Netz auf der Suche nach der eierlegenden Wollmilchsau.

  

Flexibilität bei der lokalen Webentwicklung

Meine Anforderungen an die lokale Entwicklung sind dabei vor Allem Flexibilität des Servers, da wir es mit unterschiedlichsten Technologien zu tun haben. (Sowohl im Backend als auch im Frontend) Ich möchte ohne großen Aufwand einen Service starten können, welcher mir die Webseite auf eine lokale IP ausliefert. Außerdem will ich die Möglichkeit haben, die einzelnen Services (PHP, NPM, NodeJS, bower, gulp, mysql, mongodb, captistrano, composer, …) getrennt pro Projekt updaten zu können. Ich hätte gerne ein Abbild der Konfiguration, sodass andere Programmierer, welche am Projekt mitarbeiten wollen, die gleichen Konfigurationen auschecken und installieren können, ohne den ganzen Stack immer installieren zu müssen. Da selbst das Ändern der PHP-Version bei XAMPP zum Problem wird (von anderen Technologien und geteilter Konfiguration möchte ich gar nicht erst anfangen) ist XAMPP auf Dauer keine geeignete Lösung für uns. AMPPS und auch andere LAMP-Stack Applikationen für Windows haben hier die selben Schwächen. Bei AMPPS kann man zwar die PHP-Version per Klick austauschen, jedoch lief es insgesamt nie stabil auf meinem Windows 10. Nach einem (Creators) Update meines Windows fährt AMPPS nicht mehr hoch, zudem wurde bereits mehrfach die Datenbank zerstört – das ist mir bei XAMPP bisher nicht passiert.

Alles in Allem habe ich genug von dem LAMP Stack unter Windows und begebe mich auf zu neuen Ufern.

 

Vagrant als XAMPP-Ersatz?

Als Landstreicher durch neue Täler – erste Schritte

Nachdem ich vagrant (Deutsch: Landstreicher) auf der offiziellen Seite heruntergeladen und installiert habe, habe ich mich zunächst für die VirtualBox (Standard) als Provider entschieden. Installiert – empfohlene Konfigurationen befolgt – Bluescreen. Fängt ja gut an. Nach kurzen Recherchen und Experimenten wurde VirtualBox als Übeltäter festgestellt, und aus meiner Konfiguration verbannt. Vagrant ist hier sehr modular aufgebaut und arbeitet mit diversen externen Virtualisierungsumgebungen zusammen. Momentan werden neben VirtualBox weitere Systeme wie Hyper-V, VMware, Docker oder Libvirt unterstützt.

 

Einrichten von Hyper-V

Nachdem ich die VirtualBox aus der Konfiguration entfernte, musste ein anderer Provider her, um vagrant Nährboden für seine virtuelle Umgebung zu liefern. Da mein Rechner mit Hyper-V ausgeliefert wurde, entschied ich mich dafür, der Microsoft-Technologie eine Chance zu geben.

Hyper-V kann relativ einfach über die PowerShell (mit Admin-Rechten) über folgenden Befehl aktiviert werden:
Enable-WindowsOptionalFeature -Online -FeatureName:Microsoft-Hyper-V -All

Starten von vagrant

Über den Befehl „vagrant init“ lässt sich vagrant in einem Projektordner eurer Wahl installieren. Vagrant legt dabei ein Vagrantfile in eurem Projektordner an. Dort kann man zunächst eine VM eintragen. In meinem Fall nutze ich die „generic/ubuntu1604“, eine ubuntu 16.04 LTS Distribution mit Hyper-V Unterstützung. Über „vagrant up“ startet der Server und ihr solltet über den Hyper-V-Manager eure Maschine sehen können.

Synced Files

Um in eurer Linuxumgebung auf die Dateien eures Projekts zugreifen zu können, muss ein weiterer Eintrag in eurem Vagrant-File hinzugefügt werden:
config.vm.synced_folder „.“, „/vagrant“, type: „smb“

Verflucht seien die Symlinks

In meinem Beispielprojekt werden einige Ordner mit Symlinks referenziert. Eine tolle Sache. So allgemein. Aber nicht für Vagrant. Aber es gibt eine Möglichkeit, Links trotzdem verwenden zu können. Symlinks dürfen dabei nur relativ, und nur mit dem Windowsbefehl „mklink“ angelegt werden. Das Verwenden der ln über beispielsweise git bash unter Windows führt hier zu Fehlern.

Nachdem nun auch diese Hürde genommen wurde, kann man sich über „vagrant ssh“  auf die Ubuntu-Instanz verbinden. Hier eröffnet sich nun die Linux Welt. Traumhaft. Ich werfe wild mit Linux Befehlen um mich – installiere mysql, php und apache und rufe über die IP der Hyper-V Instanz eine von mir angelegte Beispielseite auf – Es funktioniert!

Gemeinsame Konfiguration

Die Virtuelle Umgebung steht und das Konzept leuchtet ein. Aber wie können nun andere Programmierer ohne große Probleme die selbe Virtualisierung erstellen, ohne meine Virtualisierung klonen zu müssen? Über den Eintrag „config.vm.provision :shell, path: „vagrant/vagrant_install.sh“ definieren wir nun ein Script, welches für die Initialisierung der Maschine bereitgestellt wird. Sollte man die Maschine neu bauen, wird dieses Script automatisch aufgerufen und installiert alle wichtigen Applikationen und beschreibt die Konfigurationen.

Vagrant mit Typo3 – die perfekte Mischung.

Beispielsweise wurde folgendes Script für die Initialisierung eines Typo3-Projektes erstellt:

#!/usr/bin/env bash
#
Update () {
echo „– Update packages –“
sudo apt-get update
sudo apt-get upgrade
}
Update

echo „– Prepare configuration for MySQL –“
sudo debconf-set-selections <<< „mysql-server mysql-server/root_password password XYZ“
sudo debconf-set-selections <<< „mysql-server mysql-server/root_password_again password XYZ“
echo „– Install tools and helpers –“
sudo apt-get install -y –force-yes curl

 

echo „– Install mysql and php with its packages –“
sudo apt-get install -y –force-yes apache2 mysql-server
sudo apt-get install -y –force-yes apache2 php libapache2-mod-php php-mcrypt php-mysql php-cli php-curl
sudo apt-get install -y –force-yes php7.0-gd php-xml php-zip
Update

 

############################### CONFIG APACHE #####################################

echo „– Configure PHP &Apache –“
# set errors to true
sed -i „s/error_reporting = .*/error_reporting = E_ALL/“ /etc/php/7.0/apache2/php.ini
sed -i „s/display_errors = .*/display_errors = On/“ /etc/php/7.0/apache2/php.ini
# set apache user to vagrant
sed -i „s/APACHE_RUN_USER=.*/APACHE_RUN_USER=vagrant/“ /etc/apache2/envvars
sed -i „s/APACHE_RUN_GROUP=.*/APACHE_RUN_GROUP=vagrant/“ /etc/apache2/envvars
sudo a2enmod rewrite

 

echo „– Creating virtual hosts –“
sudo rm /etc/apache2/sites-available/default.conf
sudo touch /etc/apache2/sites-available/default.conf
cat << EOF | sudo tee -a /etc/apache2/sites-available/default.conf
<Directory „/var/www/“>
AllowOverride All
</Directory>

<VirtualHost *:2503>

DocumentRoot /var/www/typo3/web
ServerName typo3.dev
</VirtualHost>

<VirtualHost *:2504>
DocumentRoot /var/www/adminer
</VirtualHost>

<VirtualHost *:2505>
DocumentRoot /var/www/typo3/simplesamlphp/www
Alias /simplesaml /var/www/typo3/simplesamlphp/www
<Directory />

Require all granted
</Directory>
</VirtualHost>

EOF

echo „– Add Port 2503 to the ports of apache –“
echo „Listen 2503“ | sudo tee -a /etc/apache2/ports.conf
echo „Listen 2504“ | sudo tee -a /etc/apache2/ports.conf
echo „Listen 2505“ | sudo tee -a /etc/apache2/ports.conf

############################## install adminer #################################

mkdir -p /var/www/adminer
sudo wget „http://www.adminer.org/latest.php“ -O /var/www/adminer/index.php

 

echo „– Edit dir.con (Add index.php) –“
sudo rm /etc/apache2/mods-enabled/dir.conf
cat << EOF | sudo tee -a /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
EOF

 

############################### CONFIG MYSQL #####################################

DB_PASSWORD=“123″
DB_USERNAME=“test“
DB_DATABASE=“test“

mysql -uroot -pXYZ -e „CREATE DATABASE ${DB_DATABASE} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;“
mysql -uroot -pXYZ -e „CREATE USER ${DB_USERNAME}@localhost IDENTIFIED BY ‚${DB_PASSWORD}‘;“
mysql -uroot -pXYZ -e „GRANT ALL PRIVILEGES ON ${DB_DATABASE}.* TO ‚${DB_USERNAME}’@’localhost‘;“
mysql -uroot -pXYZ -e „FLUSH PRIVILEGES;“

 

mysql -uroot -pXYZ $DB_DATABASE < /var/www/typo3/vagrant/init.sql
# todo update passwords in database from envfile
sudo a2ensite default.conf
echo „– Restart Apache –“
sudo /etc/init.d/apache2 restart

Das Script installiert alle benötigten Pakete, updatet den Server, erstellt die vhost-Konfigurationen, initialisiert die Datenbank, öffnet die Ports, installiert ein Adminer (https://www.adminer.org/de/) und importiert eine Datenbank.

Das Script ist natürlich noch ausbaufähig, und soll hier nur als Beispiel dienen.

Erfahrung nach einigen Einsätzen

Nachdem ich vagrant nun bei 3 verschiedenen Systemen im Einsatz habe, kann ich das System nur empfehlen! Es übertrifft mit der Konfigurationsmöglichkeit jeden LAMP Stack; und durch das Verbinden auf die VM per SSH können ganz einfach alle möglichen Applikationen hinzugefügt werden.