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
  • Pillars aktivieren
  • Pillars in Sates verwenden
  • Pillars in Dateien speichern
  • Pillars on-the-fly setzen
  • Pillars auf Existenz prüfen
  • Pillars und Zeilenumbrüche

Pillars

flexibler Datenspeicher

PreviousOutputNextHosts Pillars

Last updated 5 months ago

Pillars sind flexible Key-Value-Datenspeicher. Diese bieten die Möglichkeit, Konfigurationen aus Text-Dateien auszulagern. Der gesamte Pillar-Store wird von Jinja geladen, so dass auf alle Schlüssel zugegriffen werden kann.

States werden komplett zum Minion kopiert und dort von Jinja verarbeitet. Im folgenden Beispiel werden Passwörter für API-Calls definiert. Jeder Minion verwendet sein eigenes Passwort. Da die Verarbeitung aber auf dem Minion erfolgt, kann jeder Minion alle Passwörter auslesen.

/srv/salt/examples/passwords.sls
{% set apache = salt['grains.filter_by']({
    'minion1': {'user': 'foo', 'password': 'geheim'},
    'minion2': {'user': 'foo2', 'password': 'sagichnicht'},
}, grain:'id') %}

are tree-like structures of data defined on the Salt Master and passed through to minions. They allow confidential, targeted data to be securely sent only to the relevant minion.

Pillars aktivieren

Pillars sind bereits aktiviert und der Salt-Master liest diese aus dem Verzeichnis /srv/pillar Möchten Sie stattdessen eine anderes Verzeichnis angeben, können Sie in der Master-Konfiguration die Einstellungen ändern.

/etc/salt/master.d/pillar.conf
pillar_roots:
  base:
    - /srv/pillar

Das Pillar-Root darf nicht unterhalb von File-Root liegen, weil das File-Root potentiell von allen Minions auslesbar ist. Geben Sie auf keinen Fall /srv/salt/pillar als Pillar-Root an!

Ähnlich wie bei den State-Files müssen Sie eine Datei top.sls anlegen, die weitere Dateien inkludiert.

/srv/pillar/top.sls
base:
  '*':
    - static
    - dynamic
/srv/pillar/static.sls
company: Tinyservers
address:
  street: Upperstreet 1
  zip: 12345
  city: London
  contry: UK
/srv/pillar/dynamic.sls
{% if grains['osfinger']  == 'Ubuntu-17.10' %}
php:
  version: 7.2
{% else %}
php:
  version: 7.0
{% endif %}

Prüfen Sie auf einem Minion, ob das Pillar zur Verfügung steht.

salt-call pillar.items
    php:
        ----------
        version:
            7.2

Oder prüfen Sie vom Master, welche Pillars einem Minion zugewiesen wurden.

salt <MINION-ID> pillar.items

Pillars in Sates verwenden

Es gibt drei verschiedene Möglichkeiten per Jinja auf Pillar zuzugreifen.

/srv/salt/examples/pillar-test.sls
#
# Get pillar and set default if it does not exist.
# Doesn't work in included none-state-files, if key is nested.
#
test1:
  cmd.run:
    - name: echo {{ pillar.get('settings',{}) }}

#
# Get pillar and set default if it does not exist.
# Works in included none-state-files with nested dicts
#
test2:
  cmd.run:
    - name: echo {{ salt['pillar.get']('role:wurst','Bockwurst') }}

#
# Get pillar without the chance to set a default
#
test3:
  cmd.run:
    - name: echo {{ pillar['key']['missing'] }}

pillar.get() vs salt['pillar.get']()

It should be noted that within templating, the pillar variable is just a dictionary. This means that calling pillar.get() inside of a template will just use the default dictionary .get() function which does not include the extra : delimiter functionality. It must be called using the above syntax (salt['pillar.get']('foo:bar:baz', 'qux')) to get the salt function, instead of the default dictionary behavior.

Pillars können als Variablen in allen State-Files verwendet werden. Beispiel:

#
# Install php7 on any Ubuntu
#

php7:
  pkg.installed:
    - pkgs:
      - php-gd
      - php-ldap
      - php-mysql
      - php-pear
      - php{{ pillar['php']['version'] }}-bcmath
      - php{{ pillar['php']['version'] }}-cli
      - php{{ pillar['php']['version'] }}-common
      - php{{ pillar['php']['version'] }}-gd
      - php{{ pillar['php']['version'] }}-imap
      - php{{ pillar['php']['version'] }}-json
      - php{{ pillar['php']['version'] }}-mbstring
      - php{{ pillar['php']['version'] }}-mysql
      - php{{ pillar['php']['version'] }}-opcache
      - php{{ pillar['php']['version'] }}-readline
      - php{{ pillar['php']['version'] }}-xml
      - php{{ pillar['php']['version'] }}-curl

Pillars in Dateien speichern

/tmp/pillar-test:
  file.managed:
    - contents: {{ pillar['pass']['zugang'] }}
    - user: nobody
    - mode: 644

Pillar-Keys dürfen keine Umlaute oder Sonderzeichen enthalten. Wenn die Pillar-Werte Umlaute oder Sonderzeichen enthalten, müssen UTF8-Decode anwenden.

{{ pillar['some_key'].decode('utf-8') }}

Pillars on-the-fly setzen

Pillars können On-the-fly vom salt oder salt-call Kommando gesetzt oder überschrieben werden:

salt '*' pillar.items pillar='{"server.lib_version": "2.0"}'
salt-call pillar.items pillar='{"server.lib_version": "2.0"}'

Pillars auf Existenz prüfen

/tmp/test.txt:
  file.managed:
  {% if pillar['some_key'] is defined %}
    - contents: echo {{ pillar['some_key'].decode('utf-8') }}
  {% else %}
    - contents: "a default value"
  {% endif %}

Pillars und Zeilenumbrüche

Pillar-Werte können Zeilenumbrüche enthalten. Verwenden Sie das Pipe-Zeichen bei der Zuweisung. Siehe Beispiel:

ssh_priv_key: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
    QyNTUxOQAAACDOGaOxLEDHFsrivIZ9FmNadd2KRwhEVdkqXlCR3cUSzwAAAKBMuy3mTLst
    5gAAAAtzc2gtZWQyNTUxOQAAACDOGaOxLEDHFsrivIZ9FmNadd2KRwhEVdkqXlCR3cUSzw
    AAAED4AkFCeU2/sZcKUYJ2I2ZKU8MktWnR1qZSQ622/LO3T84Zo7EsQMcWyuK8hn0WY1p1
    3YpHCERV2SpeUJHdxRLPAAAAGHJlc3RpY0BzYWx0LW1hc3Rlci5sb2NhbAECAwQF
    -----END OPENSSH PRIVATE KEY-----
ssh-run:
  cmd.run: 
    - env:
      - SSH_PRIV_KEY: {{ pillar.ssh_priv_key |yaml }}
    - name: |
        eval $(ssh-agent)
        ssh-add - <<< "$SSH_PRIV_KEY"
        ssh -l user host.example.com date

Wenn Sie diesen Pillar mit verwenden, werden die Zeilenumbrüche entfernt. Wenn die Zeilenumbrüche erhalten bleiben sollen, verwenden Sie den |yaml Filter. Siehe Zeile 4 im nachfolgenden Beispiel.

Pillars
Jinja
Pillars auslesen
Page cover image