<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Automatisierung on DevOps OPf</title><link>https://buck.zone/categories/automatisierung/</link><description>Recent content in Automatisierung on DevOps OPf</description><generator>Hugo -- gohugo.io</generator><language>de</language><copyright>Daniel 'Tealk' Buck</copyright><lastBuildDate>Fri, 09 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://buck.zone/categories/automatisierung/index.xml" rel="self" type="application/rss+xml"/><item><title>Ansible Validierungs-Skript</title><link>https://buck.zone/p/ansible-validierungs-skript/</link><pubDate>Fri, 09 May 2025 00:00:00 +0000</pubDate><guid>https://buck.zone/p/ansible-validierungs-skript/</guid><description>&lt;p&gt;Ursprünglich plante ich, &lt;a class="link" href="https://woodpecker-ci.org/" target="_blank" rel="noopener"
&gt;Woodpecker&lt;/a&gt; für die Überprüfung meiner Ansible-Dateien einzusetzen. Als die initiale Strategie nicht optimal funktionierte, entwickelte ich ein lokales Skript, das &lt;strong&gt;vor jedem Commit alle geänderten Dateien automatisch prüft&lt;/strong&gt;. Was zunächst wie eine pragmatische Anpassung aussah, entwickelte sich zu einem unverzichtbaren Werkzeug in meinem Entwicklungsprozess.&lt;/p&gt;
&lt;h2 id="was-macht-das-skript"&gt;Was macht das Skript?
&lt;/h2&gt;&lt;p&gt;Das Skript &lt;a class="link" href="https://codeberg.org/Tealk/ansible_collection/src/branch/develop/.helper/validate_ansible.sh" target="_blank" rel="noopener"
&gt;&lt;code&gt;.helper/validate_ansible.sh&lt;/code&gt;&lt;/a&gt; ist ein &lt;strong&gt;Validierungstool für Ansible-Projekte&lt;/strong&gt;. Es führt verschiedene Checks durch, die sicherstellen, dass meine Infrastruktur-als-Code sauber, konsistent und fehlerfrei bleibt.&lt;/p&gt;
&lt;h3 id="funktionen"&gt;Funktionen
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Syntax-Prüfung für YAML-Dateien&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Verwendet &lt;code&gt;ansible-playbook --syntax-check&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prüft Playbooks, Rolle-Tasks und andere YAML-Dateien&lt;/li&gt;
&lt;li&gt;Erkennt Strukturfehler bereits vor dem Commit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ansible-Lint&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zusätzliche Qualitätsprüfung der Ansible-Dateien&lt;/li&gt;
&lt;li&gt;Gibt Hinweise bei Verbesserungsmöglichkeiten&lt;/li&gt;
&lt;li&gt;Hilft, Best Practices einzuhalten&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventar-Validierung&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Überprüft Inventar-Dateien mit &lt;code&gt;ansible-inventory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Erkennt Konfigurationsunstimmigkeiten&lt;/li&gt;
&lt;li&gt;Stellt sicher, dass Hostgruppen und Variablen korrekt definiert sind&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jinja2 Template-Check&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validiert Syntax von &lt;code&gt;.j2&lt;/code&gt; Template-Dateien&lt;/li&gt;
&lt;li&gt;Stellt sicher, dass Templates korrekt aufgebaut sind&lt;/li&gt;
&lt;li&gt;Verhindert Rendering-Fehler zur Laufzeit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="flexibilität-der-nutzung"&gt;Flexibilität der Nutzung
&lt;/h3&gt;&lt;p&gt;Das Skript kann in verschiedenen Modi ausgeführt werden:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;: Prüft nur git-veränderte Dateien&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--all&lt;/code&gt;&lt;/strong&gt;: Prüft alle Dateien im Projekt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selektive Prüfung&lt;/strong&gt;: Nur Playbooks, Inventare oder Templates nach Bedarf&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="integration-als-git-hook"&gt;Integration als Git-Hook
&lt;/h2&gt;&lt;p&gt;Um die Prüfung direkt beim Commit zu erzwingen, habe ich einen &lt;a class="link" href="https://codeberg.org/Tealk/ansible_collection/src/branch/develop/.git/hooks/pre-commit" target="_blank" rel="noopener"
&gt;&lt;code&gt;.git/hooks/pre-commit&lt;/code&gt;&lt;/a&gt; Hook implementiert:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="nv"&gt;SCRIPT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.helper/validate_ansible.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; ! -x &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Fehler: Skript nicht ausführbar&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SCRIPT_PATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Fehler: Commit abgebrochen&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dieser Hook stellt sicher, dass &lt;strong&gt;kein potenziell problematischer Code committed werden kann&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="vorteile"&gt;Vorteile
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatische Qualitätssicherung&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frühe Fehlererkennung&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konsistente Code-Qualität&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nahtlose Integration in Entwicklungsprozess&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduzierung manueller Überprüfungen&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Erhöhung der Infrastruktur-Stabilität&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="technische-details"&gt;Technische Details
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sprache&lt;/strong&gt;: Bash-Skript&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abhängigkeiten&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/cli/ansible-playbook.html" target="_blank" rel="noopener"
&gt;ansible-playbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/cli/ansible-inventory.html" target="_blank" rel="noopener"
&gt;ansible-inventory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ansible-lint.readthedocs.io/" target="_blank" rel="noopener"
&gt;ansible-lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://yamllint.readthedocs.io/" target="_blank" rel="noopener"
&gt;yamllint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python3 mit &lt;a class="link" href="https://jinja.palletsprojects.com/" target="_blank" rel="noopener"
&gt;Jinja2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;Was als pragmatische Lösung begann, entwickelte sich zu einem robusten Werkzeug. Das Skript spart nicht nur Zeit, sondern erhöht auch die Qualität und Zuverlässigkeit meiner Ansible-Infrastruktur. Es ist ein Paradebeispiel dafür, wie kleine, selbstentwickelte Tools große Herausforderungen elegant bewältigen können.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tipp&lt;/strong&gt;: Investiere Zeit in Automatisierung und Validierung - es zahlt sich immer aus!&lt;/p&gt;</description></item><item><title>Von Bash-Snippets zu Ansible</title><link>https://buck.zone/p/von-bash-snippets-zu-ansible/</link><pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate><guid>https://buck.zone/p/von-bash-snippets-zu-ansible/</guid><description>&lt;h2 id="die-anfangsjahre-chaos-und-improvisation"&gt;Die Anfangsjahre: Chaos und Improvisation
&lt;/h2&gt;&lt;p&gt;Als ich mit der Systemadministration begann, war mein Alltag ein wildes Sammelsurium von Notlösungen und improvisierten Skripten. Meine wichtigste Dokumentationsquelle? Die Bash-History. Ein digitales Gedächtnis voller kryptischer Befehle, sporadischer Kommentare und halbverstandener Konfigurationen.&lt;/p&gt;
&lt;h3 id="meine-frühen-helfer"&gt;Meine frühen Helfer
&lt;/h3&gt;&lt;p&gt;Kleine, selbstgeschriebene Skripte waren meine ersten Schritte in Richtung Automatisierung. Projekte wie meine &lt;a class="link" href="https://codeberg.org/Tealk/shell-administration-script" target="_blank" rel="noopener"
&gt;Shell-Administrationsskripte&lt;/a&gt; oder &lt;a class="link" href="https://codeberg.org/Tealk/minecraft-startscript" target="_blank" rel="noopener"
&gt;Minecraft-Startskript&lt;/a&gt; waren nicht nur Werkzeuge, sondern kleine Meilensteine meiner technischen Entwicklung:&lt;/p&gt;
&lt;p&gt;Diese Skripte waren mehr als Code - sie waren meine ersten Gehversuche, Komplexität zu bändigen.&lt;/p&gt;
&lt;h3 id="die-schmerzhafte-erkenntnis"&gt;Die schmerzhafte Erkenntnis
&lt;/h3&gt;&lt;p&gt;Mit wachsender Infrastruktur wurde das System immer unübersichtlicher. Was früher als clevere Lösung begann, entwickelte sich zum administrativen Albtraum:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keine konsistenten Konfigurationen&lt;/li&gt;
&lt;li&gt;Hohe Fehleranfälligkeit&lt;/li&gt;
&lt;li&gt;Zeitraubende manuelle Eingriffe&lt;/li&gt;
&lt;li&gt;Wissensinseln statt zentraler Dokumentation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="die-entwicklung-von-skripten-zur-systematik"&gt;Die Entwicklung: Von Skripten zur Systematik
&lt;/h2&gt;&lt;p&gt;Jeder Server war eine kleine Insel mit eigener Kultur. Updates bedeuteten Stunden manueller Arbeit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dutzende Konsolen geöffnet&lt;/li&gt;
&lt;li&gt;Identische Befehle zigfach wiederholt&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="philosophische-dimension"&gt;Philosophische Dimension
&lt;/h3&gt;&lt;p&gt;Meine anfänglichen Skripte waren erste Versuche, Ordnung ins Chaos zu bringen. Doch sie waren nur Übergangslösungen - begrenzt, fehleranfällig und schwer zu warten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ansible wurde zum eigentlichen Paradigmenwechsel.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="die-ansible-transformation"&gt;Die Ansible-Transformation
&lt;/h2&gt;&lt;p&gt;Plötzlich konnte ich:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Komplexe Infrastrukturen mit wenigen Zeilen Code abbilden&lt;/li&gt;
&lt;li&gt;Systemkonfigurationen zentral und konsistent steuern&lt;/li&gt;
&lt;li&gt;Meine gesamte Serverlandschaft mit einem einzigen Kommando aktualisieren&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="was-ansible-für-mich-bedeutete"&gt;Was Ansible für mich bedeutete
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Von manueller Arbeit zur Automatisierung&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keine repetitiven Tätigkeiten mehr&lt;/li&gt;
&lt;li&gt;Standardisierte Prozesse&lt;/li&gt;
&lt;li&gt;Fehlerreduktion durch definierte Zustände&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Infrastruktur als Code&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Konfigurationen werden versionierbar&lt;/li&gt;
&lt;li&gt;Dokumentation und Ausführung verschmelzen&lt;/li&gt;
&lt;li&gt;Reproduzierbarkeit wird zum Standard&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Skalierung ohne Komplexitätszuwachs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein Playbook für alle Server&lt;/li&gt;
&lt;li&gt;Konsistente Systemzustände&lt;/li&gt;
&lt;li&gt;Minimaler manueller Aufwand&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>