Salt - grains, pillars si sabloane

Postat la Wed 13 February 2019 in tutoriale

Un aspect important in orice sistem de managementul configuratiilor este descrierea variabilor pentru sistemele administrate (minioni pentru Salt). Acest lucru se face prin:

  • grains - se definesc la minion - includ atributute sistem (OS, aplicatii instalate, etc) si variabile definite.
  • pillars - sunt definite pe master - includ uzual credentiale / setari comune pe roluri sau grupe de minioni

Sistemul de sabloane (template-uri) foloseste aceste variabile - specifice pentru minion - la generarea fisierelor de configurare.

Grains

Grains descriu componentele statice ale unui minion si sunt detectate de modulele ce ruleaza pentru functionarea corecta. De exemplu daca detecteaza ca sistemul de operare (os_family) este Debian vor folosi aplicatia apt pentru instalarea aplicatiilor si yum la minion cu sisteme de operare Redhat.

Salt detecteaza un numar mare de grains ca de ex: os_family, saltversion, adrese IP, arhitectura sistem, etc. Acestea sunt stocate in memorie la pornirea agentului pe minion (salt-minion).

O lista comleta a lor o putem obtine:

salt minion1.domeniu.meu grains.ls
minion1.domeniu.meu:
    -------------
    - biosreleasedate
    - biosversion
    - cpu_flags
    - cpu_model
    - cpuarch
    - disks
    ...

iar lista cu valori:

salt minion1.domeniu.meu grains.ls
minion1.domeniu.meu:
    -------------
    ...
    host:
        salt-node2
    hwaddr_interfaces:
        ----------
        eth0:
            00:16:3e:ce:61:71
        eth1:
            00:16:3e:38:e3:1a
        lo:
            00:00:00:00:00:00
    id:
        salt-node2.lxd
    init:
        systemd
    ip4_gw:
        192.168.25.1
    ip4_interfaces:
        ----------
        eth0:
            - 10.209.214.32
        eth1:
            - 192.168.25.108
        lo:
            - 127.0.0.1
    ...

Individual putem afisa un grain cu grains.get <nume>:

salt minion1.domeniu.meu grains.get hosts
    minion1.domeniu.meu:
        minion1.domeniu.meu

Grains pot fi adaugate sau modificate:

salt minion1.domeniu.meu grains.setval variabila valoare

sau sterse

salt minion1.domeniu.meu grains.delval variabila

Valorile custom setate sunt salvate in fisierul /etc/salt/grains pe minion.

Pillars

Pillars se utilizeaza similar ca si grains cu diferenta ca sunt definite pe master intr-o locatie centrala uzual in /srv/pillar/. Pentru targetarea specifica pe minion se foloseste tot un fisier top.sls

base:
  '*':
    - ssh
    - utils

Pentru contin doar valori statice pot fi ierarhizate foarte simplu:

Lista cu datele din pillar o puteti extrage:

salt minion1.domeniu.meu pilars.items

Pentru aplicatii avansate datele din pillars se pot imparti pe roluri, enviromente si care apoi se combina intr-un mod ordonat. O prezentare pe acest subiect este Herding Cattle with SaltStack and Targeting via CMDB

Salt permite si encriptarea datelor prin gpg

Sabloane (templates)

Salt se foloseste de sabloane ce pot include atribute din grains si pillars pentru generarea fisierelor de configurare in mod dinamic. Un engine de templating larg folosit este jinja specific in aplicatiile python.

Generarea fisierelor prin engine de templating se face cu comanda file.managed:

apache2_conf:
  file:
    - managed
    - name: /etc/apache2/apache2.conf
    - source: salt://apache2/apache2.conf
    - template: jinja

Includerea variabilor din grains se insereaza in template

The user {{ grains['user'] }} is referred to here.

sau a celor din pillar

The user {{ pillar['user'] }} is referred to here.

Se recomanda ca in cazul in care un grain/pillar nu este definit sa se populeze cu o valoare implicita:

The user {{ salt['grains.get']('user', 'larry') }} is referred to here.
The user {{ salt['pillar.get']('user', 'larry') }} is referred to here.

Jinja perminte includerea definiri de variabile similar cu alte template engines:

{% set mylist = ['mere', 'portocale', 'banane'] %}
{% set mydict = {'placinta favorita': 'placinta cu mere', 'favorite 'prajitura favorita' 'diplomat'} %}

sau inserare de logica:

{% if grains['os_family'] == 'Debian' %}
apache2:
{% elif grains['os_family'] == 'RedHat' %}
httpd:
{% endif %}
  pkg.installed : []
  service.running:
    - enabled: True

Articolul face parte din seria Aplicatii pentru managementul configuratiilor