Beachten Sie Folgendes:
{% macro directive(name, value) %}
{% if value is defined %}
{{ name }}={{ value }} # a newline hardcoded in macro follows
{% endif %}
{% endmacro -%}
# {{ ansible_managed }}
[Unit 1]
{{ directive('Description', service.description) }}# 1st hardcoded newline follows
{{ directive('Documentation', service.documentation) }}# 2nd hardcoded newline follows
{{ directive('Requires', service.requires) }}# 3rd hardcoded newline follows
Es produziert:
# Ansible managed
[Unit 1]
Description=Test Template # a newline hardcoded in macro follows
# 1st hardcoded newline follows
# 2nd hardcoded newline follows
Requires=multi-user.target # a newline hardcoded in macro follows
# 3rd hardcoded newline follows
Obwohl Dokumentation auf whitespace control states "ein einzelnes Newline falls vorhanden abgezogen wird", ist es nicht zu Variable gilt Substitution, auch wenn das Ergebnis des Makros am Ende ein Newline-Zeichen enthält, wird diese spezielle Newline nicht entfernt.
Genau wie es nicht entfernt ist, wenn Sie definieren:
variable_with_newline: "value\n"
und eine Vorlage aus:
start-{{ variable_with_newline }}-end
es produziert:
start-value
-end
an der Vorlage zu beheben entferne entweder die fest codierten Zeilenumbrüche:
[Unit]
{{ directive('Description', service.description) }}{{ directive('Documentation', service.documentation) }}{{ directive('Requires', service.requires) }}
oder explizite Leerzeichen Strippen hinzufügen:
[Unit]
{{ directive('Description', service.description) }}
{{- directive('Documentation', service.documentation) }}
{{- directive('Requires', service.requires) }}
oder
[Unit]
{{ directive('Description', service.description) -}}
{{ directive('Documentation', service.documentation) -}}
{{ directive('Requires', service.requires) }}
Warum jede Makroreferenz einen zusätzlichen Raum erzeugen? –
Ja, ich meinte "zusätzliche Zeilen" oder Zeilenumbrüche. Ich vermute, dass ich fälschlicherweise erwartet habe, dass Jinga2 automatisch die abschließende neue Zeile von jeder Makroreferenz entfernt, ähnlich wie sie es für jede Anweisung "{%%}" tut. –
Beachten Sie, dass ich den Bindestrich zu '{% end macro -%}' hinzugefügt habe, um Leerraum zwischen der Makrodefinition und '# {{ansible_managed}}' zu eliminieren. –