Jinja
Dateien und Konfigurationen mit dynamisch Inhalten versehen.

Jinja in SLS-Dateien verwenden
Alls SLS-Dateien werden immer durch die 📖 Jinja-Template-Engine "gejagt". Jinja wird aktiv, sobald es die Zeichenketten {{ }}
oder {% %}
findet.
Innerhalb von {% %}
definieren Sie Logik oder weisen Variablen Werte zu, z.B. {% set name='Salt' %}
{{ var }}
veranlasst ein Suchen und Ersetzen. Die Variable innerhalb der Klammern wird durch ihren Wert ersetzt.
Jinja kennt weder Yaml noch sonst eine Programmiersprache oder Konvention innerhalb einer verarbeiteten Datei. Das hat zur Folge, dass Jinja das übliche Kommentarzeichen #
ignoriert. Sie können mit # {{ var }}
nicht verhindern, dass die Variable ersetzt wird.
Verwenden Sie stattdessen Kommentare innerhalb der Jinja-Klammern. {# {{ var }} #}
Variablen
{% set domain = 'example.com' %}
gw:
host.present:
- ip: 192.168.1.1
- names:
- gw
- gw.{{ domain }}
mail:
host.present:
- ip: 192.168.1.2
- names:
- mail
- mail.{{ domain }}
🧩 Aufgabe
Schauen Sie sich das Beispiel zu Installation von Netdata noch einmal an. Dort wird die Versionsnummer mehrfach wiederholt. Optimieren Sie diesen State, sodass die Netdata Version nur einmal über eine Jinja-Variable definiert wird.
Fallunterscheidungen (if/else)
apache:
pkg.installed:
{% if grains['os'] == 'RedHat' %}
- name: httpd
{% elif grains['os'] == 'Ubuntu' %}
- name: apache2
{% endif %}
🧩 Aufgabe
Erstellen Sie einen State in
init/ssh.sls
, welcher den SSH-Server und Client für die unterschiedlichen Distributionen installiert.Legen Sie anschließend einen State
init/init.sls
an, der alle im Ordnerinit
gespeicherten States inkludiert. Ziel ist es, dass man mitsalt '*' state.apply init
alle Minions »initialisieren« kann, d. h. alle Basis-Konfigurationen werden angewendet.
Alle Grains sind bereits all Standard-Variablen (Python Dictionary) in Jinja verfügbar.
Schleifen
{% for user in ['moe','larry','curly'] %}
{{ user }}:
group:
- present
user:
- present
- gid_from_name: True
- require:
- group: {{ user }}
{% endfor %}
Mapping-Tabellen
In Kombination mit dem Modul kann man mit Jinja kann man Mappings ohne lange if-else-elseif-Konstruktionen erstellen. Wenn nichts anderes angegeben wird, wird das Grain os_family
zum Filtern verwendet.
{% set apache = salt['grains.filter_by']({
'Debian': {'pkg': 'apache2', 'srv': 'apache2'},
'RedHat': {'pkg': 'httpd', 'srv': 'httpd'},
}, default='Debian') %}
{{ apache.pkg }}:
pkg.installed: []

include:
- .init
php-fpm:
pkg.installed: []
{% set fpm = salt['grains.filter_by']({
'Debian': {
'backend': 'unix //var/run/php/php7.3-fpm.sock'
},
'Ubuntu': {
'backend': 'unix //var/run/php/php7.2-fpm.sock'
},
'Rocky': {
'backend': '127.0.0.1:9000'
}
},grain='os') %}
extend:
/etc/caddy/Caddyfile:
file.managed:
- contents: |
:80 {
root * /var/www
php_fastcgi {{ fpm['backend'] }}
}
/var/www/info.php:
file.managed:
- contents: <?php phpinfo(); ?>
Salt-Module in Jinja aufrufen
{% if 1 == salt['cmd.retcode']('test -f /tmp/woo.test') %}
ack:
file.touch:
- name: /tmp/woo.test
{% endif %}
Bedingungen testen und abbrechen
{% if not grains.id in salt['pillar.get']('master:nodegroups:webserver', []) %}
always-fails:
test.fail_without_changes:
- name: Requirement not met
- failhard: True
{% endif %}
Beispiel Java installieren
{% if grains['os'] == 'CentOS' %}
{% set name='java-1.8.0-openjdk-headless' %}
{% else %}
{% set name='default-jre-headless' %}
{% endif %}
{% if 0 != salt['cmd.retcode']('which java') %}
{{ name }}:
pkg.installed: []
{% endif %}
Jina Line -Statements
Wer viel Jina in SLS-Dateien verwendet, kann auf die öffnenden und schließenden Klammern {% %}
verzichten, und die sogenannten Line-Statements aktivieren. Damit kann eine komplette Zeile als Jinja-Zeile gekennzeichnet werden.
jinja_sls_env:
line_statement_prefix: ';'
line_comment_prefix: ';;'
;; This is a comment
; set var1 = ['ietm1','item2','item4']
; if grains['os_family'] == 'Debian'
; do var1.append('Debian')
; endif
; set list = var1|join(',')
/tmp/dummy.txt:
file.managed:
- contents: {{list}}
Variablen in Variablenzuweisung einfügen
Variablen können andere Variablen enthalten.
{% set my_var = grains['oscodename'] %}
{% set some_var = "some string" + grains['os_family']
{% if grains['os'] == 'Debian' %}
{% set url = "https://repo.zabbix.com/zabbix/5.0/debian/pool/main/z/zabbix-release/zabbix-release_5.0-2+debian" + grains['osrelease'] + "_all.deb" %}
{% elif grains['os'] == 'Ubuntu' %}
{% set url = "https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+" + grains['oscodename'] + "_all.deb"%}
{% endif %}
zabbix-repo:
cmd.run:
- cwd: /tmp
- name: |
set -e
wget {{ url }}
dpkg -i zabbix-release*.deb
apt-get -y update
- creates: /etc/apt/sources.list.d/zabbix.list
Last updated