Ansible: Zeilenumbrüche werden ignoriert

Unter gewissen Umständen ignoriert ansible Zeilenumbrüche in jina2 (.j2) templates.
Das Problem lässt sich jedoch einfach beheben.

Wenn man bei ansible in einem jinja2 template in der selben Zeile if/else Konstrukte hat, z.B.:
.my.cnf.j2

# .my.cnf
[client]
host={% if db_hostname is defined %}{{ db_hostname }}{% else %}localhost{% endif %}
user={% if item.value.mysql_user is defined %}{{ item.value.mysql_user }}{% else %}{{ item.value.user }}{% endif %}
password={% if item.value.mysql_password is defined %}{{ item.value.mysql_password }}{% elif item.value.password is defined %}{{ item.value.password }}{% else %}{% endif %}

Werden die nachfolgenden Zeilenumbrüche ignoriert. Aus der obigen Datei würde dann Beispielsweise:

# .my.cnf
host=MYHOSTuser=myuserpassword=secret

Dies ist ein bekannter Bug in Ansible und wird auch bei stackoverflow diskutiert.

Die Lösung ist hier, einfach zuoberst im template file die Zeile:

#jinja2: trim_blocks:False

zu setzen und Zeilenumbrüche werden wieder gemacht.
Im Beispiel hier also:

.my.cnf.j2

#jinja2: trim_blocks:False
# .my.cnf
[client]
host={% if db_hostname is defined %}{{ db_hostname }}{% else %}localhost{% endif %}
user={% if item.value.mysql_user is defined %}{{ item.value.mysql_user }}{% else %}{{ item.value.user }}{% endif %}
password={% if item.value.mysql_password is defined %}{{ item.value.mysql_password }}{% elif item.value.password is defined %}{{ item.value.password }}{% else %}{% endif %}

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert