Saltstack
  • Willkommen
  • Einführung
  • Testumgebung
    • Salt-Master öffentlicher FQDN
  • Salt installieren
    • Minions und Master "verheiraten"
  • Salt Module
    • Beispiel Benutzer anlegen
    • Dateien hin und her kopieren
  • Salt States
    • Yaml verstehen
    • Editoren anpassen
    • Beispiel Benutzer verwalten
    • Abhängigkeiten
    • Dateien editieren
    • Shell Kommandos
    • Beispiel Caddy Webserver
  • Linter
  • Minions adressieren
    • Grains
    • Hostgruppen - Node Groups
  • Jinja
    • Beispiel Caddy PHP
  • top.sls
  • Output
  • Pillars
    • Hosts Pillars
    • GPG
    • Vault
    • Datenbanken
    • Beispiel Benutzerverwaltung
  • Salt-Mine
  • Eigene Module erstellen
  • Orchestrierung
  • Returner & Job-Cache
  • Salt SSH
  • Salt API
  • Salt Cloud
    • Hinweise und Fallen
    • KVM und Libvirt
    • Scaleway
    • Digitalocean
    • Hetzner Cloud
    • eigene Deploymentscripte
    • Dynamische Portforwarding
    • Keys automatisch aufräumen
    • Start Aktionen
  • GIT
    • Alternative CD
  • Salt Reactor
  • Salt für Windows
    • Software ohne Repository installieren
    • PowerShell
    • Chocolatey Paktemanager
    • Lokales Logon Skript
    • Software Repository
  • Beispiele
    • Restic Backup
    • Apache Web-Proxy
    • Wartungstunnel
    • Unattended Upgrades
  • Salt & Etcd
  • Salt ACS
Powered by GitBook
On this page
  • Jinja in SLS-Dateien verwenden
  • Variablen
  • Fallunterscheidungen (if/else)
  • Schleifen
  • Mapping-Tabellen
  • Salt-Module in Jinja aufrufen
  • Bedingungen testen und abbrechen
  • Jina Line -Statements
  • Variablen in Variablenzuweisung einfügen

Jinja

Dateien und Konfigurationen mit dynamisch Inhalten versehen.

PreviousHostgruppen - Node GroupsNextBeispiel Caddy PHP

Last updated 1 year ago

Jinja in SLS-Dateien verwenden

Alls SLS-Dateien werden immer durch die 📖 "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

/srv/salt/exmaples/hosts.sls
{% 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

Fallunterscheidungen (if/else)

/srv/salt/examples/apache.sls
apache:
  pkg.installed:
{% if grains['os'] == 'RedHat' %}
    - name: httpd
{% elif grains['os'] == 'Ubuntu' %}
    - name: apache2
{% endif %}

🧩 Aufgabe

  1. Erstellen Sie einen State in init/ssh.sls, welcher den SSH-Server und Client für die unterschiedlichen Distributionen installiert.

  2. Legen Sie anschließend einen State init/init.sls an, der alle im Ordner init gespeicherten States inkludiert. Ziel ist es, dass man mit salt '*' state.apply init alle Minions »initialisieren« kann, d. h. alle Basis-Konfigurationen werden angewendet.

Lösung
#
# Install SSH Server and Client for different distributions
#
{% set ssh_pkg = salt['grains.filter_by']({
    'Debian': ['ssh'],
    'RedHat': ['openssh-server','openssh-clients'],
    'Suse': ['openssh-common'],
    'Arch': ['openssh']
  })
%}

install-ssh:
  pkg.installed:
    - pkgs: {{ ssh_pkg }}

Alle Grains sind bereits all Standard-Variablen (Python Dictionary) in Jinja verfügbar.

Die Einrückung der Jina-Anweisungen spielen keine Rolle. Die SLS-Datei wird erst von Jinja verarbeitet, wobei alle Jinja-Anweisungen inklusive der Steuerzeichen entfernt werden. Danach wird die Datei an den Yaml-Interpreter des Minions übergeben, der nichts davon weiß, dass die Datei vorher von Jinja "manipuliert" wurde.

Schleifen

/srv/salt/examples/users.sls
{% 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.

/srv/salt/examples/apache-map.sls
{% set apache = salt['grains.filter_by']({
    'Debian': {'pkg': 'apache2', 'srv': 'apache2'},
    'RedHat': {'pkg': 'httpd', 'srv': 'httpd'},
}, default='Debian') %}
{{ apache.pkg }}:
  pkg.installed: []
/srv/salt/caddy/php.sls
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

/etc/salt/master.d/jinja.conf
jinja_sls_env:
  line_statement_prefix: ';'
  line_comment_prefix: ';;'
/srv/salt/examples/multiline.sls
;; 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

Schauen Sie sich das Beispiel zu 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.

Wer viel Jina in SLS-Dateien verwendet, kann auf die öffnenden und schließenden Klammern {% %} verzichten, und die sogenannten aktivieren. Damit kann eine komplette Zeile als Jinja-Zeile gekennzeichnet werden.

Line-Statements
Jinja-Template-Engine
Die Python-Template-Engine
Mapping-Tabelle in Aktion
Installation von Netdata