<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jinja2 on DevOps OPf</title><link>https://buck.zone/en/tags/jinja2/</link><description>Recent content in Jinja2 on DevOps OPf</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Daniel 'Tealk' Buck</copyright><lastBuildDate>Fri, 09 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://buck.zone/en/tags/jinja2/index.xml" rel="self" type="application/rss+xml"/><item><title>Ansible Validierungs-Skript</title><link>https://buck.zone/en/p/ansible-validierungs-skript/</link><pubDate>Fri, 09 May 2025 00:00:00 +0000</pubDate><guid>https://buck.zone/en/p/ansible-validierungs-skript/</guid><description>&lt;p&gt;Initially, I planned to use &lt;a class="link" href="https://woodpecker-ci.org/" target="_blank" rel="noopener"
&gt;Woodpecker&lt;/a&gt; to check my Ansible files. When the initial strategy didn&amp;rsquo;t work optimally, I developed a local script that &lt;strong&gt;automatically checks all changed files before each commit&lt;/strong&gt;. What initially looked like a pragmatic adaptation evolved into an indispensable tool in my development process.&lt;/p&gt;
&lt;h2 id="what-does-the-script-do"&gt;What Does the Script Do?
&lt;/h2&gt;&lt;p&gt;The script &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; is a &lt;strong&gt;comprehensive validation tool for Ansible projects&lt;/strong&gt;. It performs various checks to ensure that my infrastructure-as-code remains clean, consistent, and error-free.&lt;/p&gt;
&lt;h3 id="features"&gt;Features
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;YAML File Syntax Validation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;ansible-playbook --syntax-check&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Checks playbooks, role tasks, and other YAML files&lt;/li&gt;
&lt;li&gt;Detects structural errors before 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;Additional quality check for Ansible files&lt;/li&gt;
&lt;li&gt;Provides hints for potential improvements&lt;/li&gt;
&lt;li&gt;Helps maintain best practices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inventory Validation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checks inventory files with &lt;code&gt;ansible-inventory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Identifies configuration inconsistencies&lt;/li&gt;
&lt;li&gt;Ensures host groups and variables are correctly defined&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;Validates syntax of &lt;code&gt;.j2&lt;/code&gt; template files&lt;/li&gt;
&lt;li&gt;Ensures templates are correctly structured&lt;/li&gt;
&lt;li&gt;Prevents runtime rendering errors&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="flexibility-of-use"&gt;Flexibility of Use
&lt;/h3&gt;&lt;p&gt;The script can be executed in various modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard&lt;/strong&gt;: Checks only git-changed files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--all&lt;/code&gt;&lt;/strong&gt;: Checks all files in the project&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selective Check&lt;/strong&gt;: Only playbooks, inventories, or templates as needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="integration-as-git-hook"&gt;Integration as Git Hook
&lt;/h2&gt;&lt;p&gt;To enforce checking directly during commit, I implemented a &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:&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;Error: Script not executable&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;Error: Commit aborted&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;This hook ensures that &lt;strong&gt;no potentially problematic code can be committed&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="advantages"&gt;Advantages
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic Quality Assurance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Early Error Detection&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent Code Quality&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seamless Integration into Development Process&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduction of Manual Checks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Increased Infrastructure Stability&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="technical-details"&gt;Technical Details
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language&lt;/strong&gt;: Bash Script&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependencies&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 with &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="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;What began as a pragmatic solution developed into a robust tool. The script not only saves time but also increases the quality and reliability of my Ansible infrastructure. It&amp;rsquo;s a prime example of how small, custom-developed tools can elegantly tackle significant challenges.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;: Invest time in automation and validation - it always pays off!&lt;/p&gt;</description></item></channel></rss>