Ansible Entwicklung mit Vagrant


  • Sun 04 December 2022
  • Linux

In letzter Zeit entwickel ich sehr viele Ansible Rollen und Playbooks. Kleinere Sachen kann man schnell mal gegen eine TestVM laufen lassen. Bei größeren Sachen wird das aber schon schwieriger.

Im aktuellen Beispiel möchte ich am Ende eine fertigen LAMP haben, auf dem ein durchkonfigurieretes CMS läuft. Dafür sind dann sehr viele Rollen nötig ( Apache, MySQL, PHP-FPM...)

Zum Testen nutze ich deshalb Vagrant. Mit Vagrant kann mann das oben genannte Szenario dann auch super auf unterschiedlichen Betriebssystemen testen.

Vagrant erstellt und verwaltet virtuelle Maschinen. Es lässt sich aus der Kommandozeile bedienen und hat (wie ich finde) eine sehr einfache Syntax. In Bezug auf Ansible nimmt Vagrant einem auch einige Arbeit ab. Ich muss mich um kein Inventory kümmern und auch der ssh Zugang incl. Benutzer wird von vagrant gemanaged.

Voraussetzung für die Nutzung von Vagrant ist eine funktionierende VirtualBox Installation.

Die Installation von Vagrant in Debian z.B. über den Pakate Manage erfolgen:

apt install vagrant

Ansonsten steht in der offiziellen Dokumentation auch noch mal alles drin.

Zuerst muss man das Vagrantfile erstellen. Es enthält alle Informationen die nötig sind um die VM, basierend auf einem Image aus der Vagrantcloud, zu importieren. Um die Datei zu erstellen und z.B. Ubuntu zu nutzen führt man folgenden Befehl aus:

vagrant init ubuntu/jammy64

Die Kommentare im Vagrantfile sind sehr hilfreich beim umkonfigurieren der VM. Diese sollte man sich in Ruhe durchlesen.

Bisher is es aber noch sehr überischtlich (Kommentare entfernt):

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

Vagrant.configure("2") do |config|
    config.vm.box = "ubuntu/jammy64"
end

Um die VM dann zu starten nutzt man folgenden Befehl:

vagrant up

Beim ersten mal kann dies einen Moment dauern, da Vagrant erst das Image herunterladen muss. Anschlißend entfällt dieser Punkt und das erzeugen / starten der VM geht deutlich schneller. Das Image wird in einem versteckten Ordner mit dem Namen .vagrant abgelegt. Befindet man sich in einem git Repository sollte man diesen Ordner auf jeden Fall zur .gitignore hinzufügen.

Ein direkter Login mit SSH ist dann mit folgendem Befehlt möglich:

vagrant ssh

Es wurde automatisch ein ssh key generiert, mit dem man sich auf der VM einloggen kann. Der User in der VM hat sudo Rechte (ohne Passwort). In den default Einstellungen wird auch das aktuelle Verzeichnis als Shared Folder nach /vagrant gemountet.

Wenn man genug mit der VM herumgespielt hat kann man anschließend mit dem folgenden Befehlt die VM wieder löschen:

vagrant destroy

Für die Ansibleentwicklung war das Image für mich aber so noch nicht nutzbar. Ich habe mir dafür ein eigenes Vagrantfile gebaut.

Ein nützlicher Befehl nach dem editieren des Vagrantfile ist:

vagrant validate

Zum besseren Verständnis zerlege ich das Vagrantfile hier in kleine Teile und erkläre eniges dazu.

Eine allgemeine Einstellungen die ich vornehme ist das deaktivieren des Sharedfolders, da er für die Ansibleentwicklung nicht benötigt wird.

config.vm.synced_folder '.', '/vagrant', disabled: true

Für VMs die ich anlegen will habe ich folgende Einträge in meinem Vagrantfile:

#config.vm.define "centos" do |centos7|
    #cents7.vm.box = "centos/7"
    #centos7.vm.hostname = "centos7.ansible"
#end

#config.vm.define "debian" do |debian11|
    #debian1.vm.box = "debian/bullseye64"
    #debian11.vm.hostname = "debian11.ansible"
#end

config.vm.define "ubuntu" do |ubuntu|
    ubuntu.vm.box = "ubuntu/jammy64"
    ubuntu.vm.hostname = "ubuntu.ansible"
    ubuntu.vm.network "forwarded_port", guest: 80, host: 8000, host_ip: "127.0.0.1"
    ubuntu.vm.network "forwarded_port", guest: 443, host: 4443, host_ip: "127.0.0.1"
end

Ich habe immer mehrere Distributionen dort stehen und konfiuriert. Diese kann ich einfach durch einkommentieren bei Bedarf aktivieren. Es ist auch möglich mehrere VMs gleichzeitig laufen zu lassen (wenn man die Ressource hat ;-)). Für die Ubuntu vm habe ich zwei Portforwardings aktiviert, damit ich den Zugriff von extern auf die VM per Browser testen kann.

Um das ganze dann mit ansible in Verbidung zu bringen ist folgender Eintrag nötig:

config.vm.provision "ansible" do |ansible|
    ansible.verbose = "v"
    ansible.playbook = "main.yml"
end

Vagrant hat den Befehl provision:

provision       provisions the vagrant machine

Dadurch kann ich mit Hilfe von Ansible eine Vagrant VM provisionieren. Wenn ich ein vagrant up ausführe wird das provisioning automatisch ausgeführt. In diesem Fall wird das Playbook mit dem Namen main.yml, dass sich im aktuellen Ordner befindet ausgeführt.

Um das Provisioning dann erneut auszuführen kann folgender Vagrantbefehl genutzt werden:

vagrant provision

Ich entwickle mittlerweile mehrere Monate meine Ansible Rollen und Playbooks so. Es ist ein leichtes hiermit mal eben eine neue VMs zu erstellen, Playbooks dagegen schiessen und dann wieder zu verwerfen. Das Vagrantfile kann ich auch einfach zwischen mehreren Computern tauschen. Dadurch habe ich dann auf allen PCs immer die gleiche Testumgebung.

In diesem Sinne:

vagrant up

TESTEN

vagrant destroy

REPEAT