Vagrant Was, warum und wie

In diesem Artikel erfahren Sie, wie Sie mit Vagrant Ihre virtuellen Maschineninstanzen verwalten. Außerdem wird erläutert, wie Sie Puppet zur Bereitstellung verschiedener Ressourcen wie PHP und PostgreSQL nutzen können.


Einführung

Entwickler haben eine riesige Auswahl an Möglichkeiten, um ihre Webentwicklungsumgebung aufzubauen.

Entwickler haben eine riesige Auswahl an Möglichkeiten, um ihre Webentwicklungsumgebung aufzubauen. Sie können "lokale" Optionen verwenden, z. B. die Installation von vorkonfigurierten "All-in-One" -Serverstacks wie Zend Server, XAMPP, MAMP, WAMP usw., oder Sie können die Komponenten selbst von der Quelle oder über installieren Paketverwaltungssysteme wie Homebrew, Apt und Yum.

Dies kann sich bei der Arbeit an verschiedenen Projekten mit PHP 5.3 und PHP 5.4, MySQL, SQLite, MongoDB, Postgres, PEAR, PHPUnit, Rails 3.1, Memcached, Redis, Gearman, NodeJS usw. aufbauen. Wenn Sie ein Upgrade durchführen oder der Computer stirbt Du musst wieder von vorne beginnen.

Sie könnten eine "Remote" -Einrichtung haben, die einen Server im Netzwerk mit Samba-Freigaben verwendet, oder einen SSH-Server, der mit einem Tool wie ExpanDrive bereitgestellt wird. Die letztere Option kann zu Latenzen beim Lesen / Schreiben von Dateien führen, die äußerst ärgerlich sind. Sie können SSH + Vim für alles verwenden, was schnell ist, aber das funktioniert nur, wenn Sie Vim für alles verwenden möchten.


Entwicklung vs. Produktion

Während Sie vielleicht mit dem, was Sie gerade tun, zufrieden sein können, wie viele von Ihnen gehört haben (oder gesagt haben) "Nun, es funktioniert auf meinem Computer". Dies ist furchtbar häufig und tritt auf, wenn sich die Umgebungen sogar durch die unbedeutendsten Details unterscheiden.

Es ist äußerst wichtig, sicherzustellen, dass Ihre Entwicklungsumgebung mit der Produktionsumgebung identisch ist und Staging- und Testserver übereinstimmt, falls Sie auch über diese verfügen.

Das hört sich vielleicht einfach an, wenn Sie nur über die Installation von Apache, PHP und einigen MySQL-Kopien nachdenken, aber es gibt eine Million Faktoren, über die Sie nachdenken müssen. Wenn Sie unter OSX entwickeln und auf einem Ubuntu-System implementieren, werden Sie Probleme mit der Dateikapitalisierung feststellen. Dies ist in CodeIgniter üblich, wenn jemand eine Bibliothek mit einem Kleinbuchstaben hat. Es wird problemlos unter OSX geladen, bricht jedoch bei der Bereitstellung für die Produktion ab. Ihr Entwicklungsprozess hat Ihnen vielleicht gerade einiges an Geschäft verloren, alles wegen eines geringfügigen Unterschieds zwischen den Betriebssystemen, an das niemand gedacht hat, bis es zu spät war.


Entwicklung = Produktion

Wenn Entwickler gezwungen werden, dasselbe Betriebssystem zu verwenden, führt dies zu Problemen.

Was ist also die Lösung? Erzwingen Sie alle Ihre Entwickler, ihre verschiedenen Tools auszuwerfen und auf demselben Laptop-Modell zu entwickeln? Wenn Ihre Entwickler alle brandneue Macbooks erhalten, werden Sie möglicherweise nicht zu viele Beschwerden erhalten, müssen dann jedoch OSX Server für alles verwenden.

Sie könnten Linux für alles verwenden, aber dann müssen Sie darüber streiten, welche Distribution verwendet werden soll. Wenn Entwickler gezwungen werden, dasselbe Betriebssystem zu verwenden, führt dies zu Problemen, zur Verringerung der Produktivität und zur Förderung von Nerdkämpfen.

Virtualisierung ist die Antwort und ist nichts Neues, aber wenn Leute an Virtualisierung denken, denken sie oft an Leistungsprobleme und ihre Fans, die sich wild drehen, während ihr Laptop verzweifelt versucht, zwei Betriebssysteme zu betreiben.

Dies kann immer noch der Fall sein, wenn versucht wird, Windows auf einem Computer mit geringer Leistung auszuführen, aber heutzutage verfügt ein durchschnittlicher Mac über 4 GB RAM, was mehr als ausreichend ist, um eine Ubuntu-Serverinstallation im Befehlszeilenmodus zu betreiben und alle Ihre üblichen Entwicklungswerkzeuge (IDE, Browser, Debugging-Tools usw.). Es gibt einige Optionen für die Virtualisierung, aber ich bevorzuge VirtualBox von Oracle (was kostenlos ist). Diese Software erledigt alle Aufgaben für die Virtualisierung. Anschließend verwaltet ein Tool namens Vagrant die Instanzen.


Schritt 1 - VirtualBox installieren

Laden Sie zunächst VirtualBox herunter und installieren Sie es. Auf * nix-Systemen (Mac OSX, Linux usw.) müssen Sie Ihr System ändern .bash_profile (oder .zsh_profile), um Ihre $ PATH Variable:

PATH = $ PATH: /Applications/VirtualBox.app/Contents/MacOS/ export PATH

Auf diese Weise kann Vagrant wissen, wo VirtualBox installiert ist, und variiert natürlich je nach Betriebssystem.


Schritt 2 - Installieren Sie Vagrant

Sie können einen Vagrant Build für Ihr Betriebssystem herunterladen oder als Juwel installieren, wenn einer nicht verfügbar ist:

$ gem install vagrant

Schritt 3 - Erstellen Sie eine Instanz

Machen Sie sich einen Ort für Ihre Vagabunden-Setups:

mkdir -p ~ / Vagrant / Test-CD ~ / Vagrant / Test

Wir werden Ubuntu 12.04 LTS (Precise Pangolin) verwenden, das bereits eine "Box" eingerichtet hat.

Vagrant Box fügen Sie präzise32 http://files.vagrantup.com/precise32.box hinzu

Sie sehen hier das Argument "exact32", das einen Spitznamen für die URL darstellt. Sie können jetzt eine Instanz erstellen, die diese .box herunterlädt.

vagrant init precision32 vagrant auf

Es wird jetzt laufen. Einfach! Wenn Sie über SSH in diese Instanz gelangen möchten, verwenden Sie diesen Befehl:

vagrant ssh

Schritt 5 - Konfiguration

Sie haben eine Datei, genannt Vagrantfile, welche Konfiguration für diese Instanz enthält:

# - * - Modus: ruby ​​- * - # vi: set ft = ruby: Vagrant :: Config.run do | config | config.vm.box = "exact32" config.vm.box_url = "http://files.vagrantup.com/precise32.box" # Weisen Sie diese VM einer Host-Only-Netzwerk-IP zu. Dies ermöglicht Ihnen den Zugriff über die # IP. Host-Only-Netzwerke können sowohl mit dem Host-Computer als auch mit # anderen Computern im selben Netzwerk kommunizieren, auf die jedoch (über diese # Netzwerkschnittstelle) kein Zugriff von externen Netzwerken möglich ist. config.vm.network: hostonly, "192.168.33.10" # Legen Sie für die Standard-Projektfreigabe die Verwendung von nfs config.vm.share_folder ("v-web", "/ vagrant / www", "./www",: nfs = fest > true) config.vm.share_folder ("v-db", "/ vagrant / db", "./db",: nfs => true) # Leiten Sie einen Port vom Gast an den Host weiter. Computer für den Zugriff auf die VM, während das Host-Only-Netzwerk dies nicht tut. config.vm.forward_port 80, 8080 # Setzen Sie die Zeitzone auf einen nützlichen Wert für config.vm.provision: shell,: inline => "echo \" Europe / London "| sudo tee / etc / timezone && dpkg-reconfigure --frontend noninteractive tzdata "# Aktualisieren Sie den Server config.vm.provision: shell:: inline =>" apt-get update --fix-missing "# Aktivieren Sie Puppet config.vm.provision: puppet do | puppet | puppet.facter = "fqdn" => "local.pyrocms", "hostname" => "www" puppet.manifests_path = "puppet / manifests" puppet.manifest_file = "ubuntu-apache2-pgsql-php5.pp" .module_path = "Marionette / Module" Ende

Wenn Sie es nicht bemerkt hätten, ist dies die Ruby-Syntax. So können Sie mit dieser Datei ziemlich kreativ werden, aber dies ist die Grundlage.

Es wird angezeigt, welchen Spitznamen verwendet werden soll, und die URL muss vorhanden sein, falls der Kurzname nicht lokal eingerichtet ist (gut für die gemeinsame Nutzung)..

Das Ordner teilen Zeilen sind wirklich nützlich, um einen Ordner in der Instanz einem lokalen Ordner zuzuordnen. Verwenden nfs => true Die Instanz kann Berechtigungen für die Dateien schreiben und ändern. Dies ist nützlich, wenn Sie beispielsweise versuchen, einen CMS dort zu installieren.

Über Portweiterleitung können Sie auf Ihre Instanz zugreifen http: // localhost: 8080 und ändern Sie das natürlich in einen anderen Port, wenn dies zu Konflikten führt.

In dieser Konfigurationsdatei wird auch die Zeitzone auf Europe / London festgelegt und anschließend ausgeführt apt-get Update, Dies sollte Ihr System zwingen, auf dem neuesten Stand zu sein, wenn es gestartet wird. Wenn Sie dieses Konfigurationselement überspringen, wird die Installation möglicherweise von mehreren Paketen abgelehnt, da die Verweise jetzt nicht mehr aktuell sind.

Wenn Sie die Konfiguration ändern, können Sie die Instanz erneut laden, um sie zu verwenden:

vagrant reload

Jetzt, da unsere Server betriebsbereit sind, müssen wir einige Software installieren. Wir gehen nicht nur hin apt-get install Ein paar Pakete über die Kommandozeile "bereitstellen" wir unsere Server.


Schritt 4 - Bereitstellung

Server-Provisioning ist nicht etwas, über das viele Entwickler nachdenken müssen.

Server-Provisioning ist kein Grund, worüber viele Entwickler nachdenken müssen, da dies normalerweise Sysadmins überlassen wird. Die Idee ist, einige Aufzeichnungen darüber zu machen, welche Software und Konfiguration auf einem Server erstellt wurde, sodass Sie neue Entwicklungsumgebungen, neue Staging-Server erstellen können, die die Produktion replizieren, oder einen anderen Produktionsserver erstellen, um die Lastverteilung zwischen den beiden zu gewährleisten.

Old-School-Bereitstellung

Die Art und Weise, wie Sysadmins damit umgehen, ist unterschiedlich, aber in der Vergangenheit wurden alle möglichen Lösungen verwendet - von der Ausführung eines Befehls-Wikis (das schnell groß werden kann und schnell veraltet ist) und dem großartigen Ansatz eines "Multi-Terminals", wo Sie tippen Befehle in ein Fenster und repliziert gleichzeitig dieselben Befehle auf weiteren 7 Servern. Diese Methoden sind alle schrecklich.

Eine Lösung wäre, eine eigene zu bauen .Box Datei oder erstellen .iso Backups, also können neue Server nur darauf basieren, aber die Pflege dieser Images erfordert viel zusätzliche Arbeit, und egal wie sehr Sie sich auch bemühen, werden diese Entwicklungsmaschinen mit der Zeit nicht mehr synchron sein.

Moderne Versorgung

Momentan gibt es zwei populäre Systeme, genannt Puppet und Chef.

Momentan gibt es zwei populäre Systeme, genannt Puppet und Chef. Beide gibt es schon seit Jahren, sind jedoch mit der Erhöhung der DevOps-Entwicklungsmethode immer beliebter geworden. Die Ideen für beide sind ähnlich, und Sie sollten beide Systeme untersuchen. Dieses Tutorial konzentriert sich jedoch ausschließlich auf Puppet.

Anstatt eine Reihe von Befehlen auszuführen und zu hoffen, dass alles gut funktioniert, erstellen Sie ein Manifest für Puppet, in dem alles erklärt wird, was Sie benötigen, um sicherzustellen, dass dies ausgeführt wurde. Wenn Sie einen Befehl im Terminal ausführen, sagen Sie im Wesentlichen zum Computer:

"Apache installieren"

Mit Puppet würden wir sagen:

"Sicherstellen, dass Apache installiert ist"

Oder statt:

"Erstellen Sie einen neuen Ordner mit dem Namen / var / www und Berechtigungen für www-data festlegen: www-data "

Mit Puppet würden wir sagen:

"Dafür sorgen / var / www existiert und hat Berechtigungen, die mit www-data übereinstimmen: www-data "

Der Unterschied hier ist, dass diese Manifeste mehrmals ausgeführt werden können (stündlich oder täglich), um die Dinge auf dem neuesten Stand zu halten, und es gibt keine unerwarteten Ergebnisse von etwas, das versucht, zweimal zu installieren.

Es hilft Ihnen auch zu testen, ob alles wie erwartet läuft, da eine dieser Regeln fehlerhaft ist und Fehler auftreten, die einfacher zu verfolgen sind, als eine große Anzahl von bash-Befehlsergebnissen. Puppet gibt große rote Fehler aus, die Sie darüber informieren, dass PHP nicht installiert wurde oder ein bestimmtes Modul nicht konfiguriert werden konnte.

Manifeste und Module

Manifeste sind zunächst etwas verwirrend, aber nach einer Weile machen sie Sinn.

Um ein grundlegendes Beispiel zu überprüfen:

Datei 'testfile': Pfad => '/ tmp / testfile', sicherstellen => vorhanden, Modus => 0640, Inhalt => "Ich bin eine Testdatei.",

Es ist nicht nötig zu erklären, was hier passiert, richtig?

Diese Datei kann später in Ihrem Manifest als "Testdatei" bezeichnet werden, dh sie kann als Abhängigkeit für andere Aktionen aufgeführt werden.

Weitere Beispiele finden Sie in den PyroCMS Puppet-Manifesten auf GitHub.

include apache $ docroot = '/ vagrant / www / pyrocms /' $ db_location = "/vagrant/db/pyrocms.sqlite" # Apache-Konfigurationsklasse 'apache :: php': apache :: vhost 'local.pyrocms' : Priorität => '20', Port => '80', docroot => $ docroot, configure_firewall => false, a2mod 'rewrite': sure => present; 

Dazu gehört das "Apache" -Modul, das einige Variablen einstellt, das zusätzliche Manifest "Apache :: Php" im Apache-Modul ausführt, einen virtuellen Host einrichtet und dann "Mod_rewrite" aktiviert.

Alle diese Klassen sind in dem von uns eingeschlossenen Apache-Modul definiert.

Weiter wollen wir auch PHP installieren:

include php php :: module ['xdebug', 'pgsql', 'curl', 'gd']: notify => [Dienst ['httpd']]] php :: conf ['pdo', ' pdo_pgsql ']: required => Paket [' php5-pgsql '], benachrichtigen => Service [' httpd '],

In diesem Teil des Manifests werden die benötigten PHP-Erweiterungen installiert benachrichtigen Diese Option informiert Apache darüber, dass Sie eine neue Konfiguration installiert haben, dh, es wird neu gestartet.

Include postgresql class 'postgresql :: server': postgresql :: db 'pyrocms': owner => 'pyrocms', password => 'password',

Dadurch wird ein Postgres-Server eingerichtet, eine Datenbank mit dem Namen "Pyrocms" erstellt und sichergestellt, dass ein Benutzer mit dem Namen "Pyrocms" mit dem bereitgestellten Kennwort vorhanden ist.

Fast fertig! Der letzte Schritt besteht darin, sicherzustellen, dass Sie schreibbare Dateien und Ordner korrekt festgelegt haben:

Datei $ docroot: sure => 'directory', Datei "$ docroot system / cms / config / config.php": sure => "present", mode => "0666", erfordern => Datei [ $ docroot], $ writeable_dirs = ["$ docroot system / cms / cache /", "$ docroot system / cms / config /", "$ docroot addons /", "$ docroot" / cache / "," $ docroot uploads / "] Datei $ writeable_dirs: sure =>" verzeichnis ", mode => '0777', required => Datei [$ docroot],

Dadurch wird sichergestellt, dass das Apache-Dokumentstammverzeichnis vorhanden ist, die Konfigurationsdatei auf 0666 festgelegt ist und einige beschreibbare Ordner auf 777 gesetzt sind.

Da haben wir es!

Um all dies auszuführen, starten Sie einfach Ihre Vagabund-Instanz neu oder führen Folgendes aus:

vagrant Bestimmung

Wenn alles richtig funktioniert hat, sollten Sie viel blauen Text sehen, der signalisiert, dass alles installiert wird, aber wenn etwas schief geht, werden Sie rot sehen. Google diese Fehler und versuchen Sie es erneut.

Die hier verwendeten Module sind: Apache, Postgres, PHP und Sie können das ganze in Aktion sehen, indem Sie das PyroCMS Vagrant-Repo klonen:

git clone --recursive git: //github.com/pyrocms/devops-vagrant.git ~ / vagrant / pyrocms cd ~ / vagrant / pyrocms auftauchen

Zeigen Sie mit Ihrem Browser auf http: // localhost: 8089 / und Sie sollten den Installer sehen. Leichtes Zeug, huh?

Hinweis: Dies wird mit MySQL installiert, da die Unterstützung von PyroCMS für Postgres und SQLite noch in der Entwicklung ist und darauf wartet, dass einige CodeIgniter-PDO-Funktionen abgeschlossen werden. Wenn Sie interessiert sind, können Sie experimentieren, indem Sie die Vagrant-Datei so ändern, dass sie die ubuntu-apache2-pgsql-php5.pp Manifest, zerstören Sie die Instanz und starten Sie sie erneut. Das Pyrocms-Submodul muss ebenfalls an feature / pdo ausgecheckt werden


Zusammenfassung

In diesem Artikel haben wir Vagrant, VirtualBox und Puppet verwendet, um nicht nur eine Serverinstanz festzulegen, mit der wir arbeiten können. Wir haben eine Testsuite für unseren Server erstellt, um sicherzustellen, dass alles ordnungsgemäß ausgeführt, installiert und konfiguriert ist.

Wir haben auch eine Checkliste für die Anforderungen erstellt und können zukünftig eine beliebige Anzahl identischer Server in Minuten und nicht in Stunden erstellen!