Automation gehört für mich zu einer der Basis-Disziplinen im Bereich DevOps. Denn eine geordnete und effiziente Zusammenarbeit zwischen Entwicklung und Betrieb kann mit automatisierten Vorgängen stark gefördert werden.
Deployments
Tasks, wie zum Beispiel Deployments, Integrations-Tests oder Serverinstallationen sind manchmal mühselige manuelle Arbeiten welche durch ihre Komplexität und/oder Länge fehleranfällig sind. Hier setze ich an und erstelle zusammen mit den Entwicklern automatisch ablaufende Programmskripts. Dies bringt die Vorteile, dass die die Tasks nun reproduzierbar sind und somit kontrolliert immer denselben Output erzeugen. Weiter muss sich das Team nicht mehr um diese eine vielleicht-geht-etwas-schief Aufgabe kümmern, sondern weiss, dass nun jeder im Team den automatisierten Task starten und sich um eine andere Aufgabe kümmern kann. Zuletzt ist noch zu erwähnen, dass sich ab einer bestimmten Grösse einer solchen Sammlung von vordefinierten Funktionen nach und nach parallelen zu anderen Projekten oder sogar innerhalb des Projekts bilden und somit die Automatisierung auch portabel und übertragbar ist.
Wir hier bei Noser verwenden für solche Aufgaben ein breites Spektrum an etablierten Tools. Mit Jenkins oder Azure DevOps können automatisierte Build und Deployment Aufgaben erstellt, ausgeführt und analysiert werden. Um hier aus dem Vollen schöpfen zu können, bietet es sich an, mit den sogenannten Pipeline-Files der jeweiligen Umgebung zu arbeiten. Dies hat den Vorteil, dass die Definition der Aufgabe als eine Datei in einem gängigen und lesbaren Format vorhanden ist. Diese Datei wird dann auch in die Source-Code-Verwaltung eingecheckt, so dass Änderungen nachvollziehbar und umkehrbar sind. Dieses Vorgehen hat mittlerweile auch eine eigene Bewegung ausgelöst die GitOps heisst.
Automation mit Ansible
Um frische und neue Server in die gewünschte Konfiguration zu versetzen benutze ich Ansible. Es ermöglicht das Erstellen von Skripts, die dann auf mehreren Servern gleichzeitig ausgeführt werden können, so dass alle Server die gewünschte Konfiguration haben. Auch hier wird mit simplen Definitions-Dateien gearbeitet, die dann Ansible ausführt. Somit sind auch die Änderungen zur Infrastruktur bereit für die Source-Code-Verwaltung, damit auch die Automations-Skripte gleich wie Programmcode verwaltet werden.
Automatisierte Entwicklungsumgebungen
Einen ähnlichen Ansatz kann man für lokale Entwicklungsumgebungen verfolgen, so dass man innerhalb des Projekts reproduzierbare Umgebungen vorfindet. Dazu verwende ich Vagrant, welches mir erlaubt eine Definitionsdatei zu schreiben mit der ich eine oder mehrere virtuelle Maschinen beschreibe. Dies fängt mit dem zu verwendenden Betriebssystem an und geht über die Netzwerk- und Hardware-Einstellungen der virtuellen Maschine bis hin zu einzelnen Kommandozeilen Befehlen, die automatisch beim Starten ausgelöst werden. Somit erhält man eine portable und idempotente Umgebung, welche sich beliebig oft zerstören und wiederaufbauen lässt. Diese sogenannten Vagrantfiles lassen sich ebenfalls hervorragend in eine Source-Code-Verwaltung ablegen, so dass auch hier der Ansatz von GitOps verwendet wird.

Vagrant Workflow und mögliche VM Provider und Provisionierungs-Tools (slashroot.in/what-vagrant-and-how-does-it-work)
Vorteile der Automatisierung
Viele Aspekte der Entwicklung lassen sich heutzutage automatisieren und auch über Git o.ä. steuern. Automatisierung heisst aber auch, sich Gedanken zu machen, was der genau Ablauf in einem bestimmten Entwicklungsprozess ist. Dies deckt manchmal sogar ineffiziente Vorgänge auf, die so optimiert werden können. Effektiv automatisierte Prozesse nehmen dem Entwicklungsteam wiederkehrende Arbeiten ab und führen diese in einen reproduzierbaren Zustand. Dadurch wird Daily-Business reduziert, wodurch mehr Zeit für Entwicklungsarbeiten übrig bleibt.