<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git-Hook on DevOps OPf</title><link>https://buck.zone/tags/git-hook/</link><description>Recent content in Git-Hook 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/tags/git-hook/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></channel></rss>