Pas à pas sur les Pillars

Les Pillars sont des arborescences de données définies sur le Salt Master et envoyées aux Minions. Ils permettent la confidentialité, l’envoie sécurisé des données ciblées seulement sur le Minion approprié.

Note

Grains et Pillars peuvent amener à confusion, il faut se souvenir que les Grains sont des données sur un Minion qui sont stockées ou générées depuis un Minion. C’est pouqruoi les informations tel que l’OS et la CPU se trouvent dans les Grains. Pillar est une information sur un Minion ou plusieurs Minions stockées ou générées sur le Salt Master.

Les Données Pillar sont utiles pour:

Des données hautement sensibles:
L’information transférée depuis Pillar est garantie être seulement présenté aux Minions qui sont ciblés, ce qui fait de Pillar un objet adapté pour gérer des informations sécurisées, tel que des clés cryptographiques et de mots de passe.
La configuration des |minions|:
Les modules Minion tel que les modules d’éxécution, d’état, et “returners” peuvent souvent être configurés depuis des données stockées dans le Pillar.
Les variables:
Les variables qui ont besoins d’être assignées à des Minions spécifique ou des groupes de Minions peuvent être défini dans un Pillar pour ensuite être accesibles dans une formule SLS et des fichiers “template”.
Des données arbitraires:
Pillar peut contenir une structure de données basique, donc une liste de valeurs, ou un couple clé/valeur peut être défini ce qui le fait plus simple à le répéter dans un groupe de valeurs dans une formule SLS.

Pillar est donc un des plus important système lorsque nous utilisons Salt. Ce tutoriel est construit pour créer un Pillar simple et opérationnel en peu de temps puis se plonger dans les capacités de Pillar et trouver où sont les données.

Configurer Pillar

Pillar est démarré par défaut avec Salt. Pour voir les données Pillar des Minions:

salt '*' pillar.items

Note

Avant la version 0.16.2, cette fonction est nommé pillar.data. Ce nom de fonction est toujours supporté pour assurer la comptabilité.

Par défaut le contenu du fichier de configuration maître est chargé dans le Pillar de tous les Minions. Ce qui permet que le fichier de configuration maître soit utilisé pour une configuration globale des Minion.

Pillar comprend des fichiers SLS et un top file, comme l’arborescence des states. L’emplacement par défaut de Pillar est: /srv/pillar.

Note

L’emplacement de Pillar peut être configuré depuis l’option pillar_roots dans le fichier de configuration du maître. Il ne doit pas être dans un sous-répertoire de l’arborescence state.

Pour commencer à configurer le Pillar, le repertoire srv/pillar doit être présent:

mkdir /srv/pillar

Maintenant créons un “top file“, en suivant le même format que notre “top file“ utilisé pour les states:

/srv/pillar/top.sls:

base:
  '*':
                - data

Ce “top file“ associe le fichier data.sls à tous les Minions. Maintenant, le fichier /srv/pillar/data.sls doit être rempli:

/srv/pillar/data.sls:

info: some data

Pour s’assurer que tous les minions ont les données du nouveau Pillar, il faut lancer une commande sur eux leur demandant de récupérer leurs Pillars depuis le master:

salt '*' saltutil.refresh_pillar

Maintenant que tous les Minions ont le nouveau Pillar, on peut le récupérer:

salt '*' pillar.items

La clé info devrait apparaitre dans le retour des données du Pillar.

Des données un peu plus complexes

Contrairement aux States, Pillar n’a pas besoin de définir des formules. Cet exemple ajoute des utilisateurs avec leur UID respectif:

/srv/pillar/users/init.sls:

users:
  thatch: 1000
  shouse: 1001
  utahdave: 1002
  redbeard: 1003

Note

La même recherche sur les répertoire que pour les States existe pour Pillar, donc le fichier users/init.sls peut être référencé en tant que users dans le fichier “top file“.

Nous allons devoir modifier le “top file“ pour inclure notre nouveau fichier SLS:

/srv/pillar/top.sls:

base:
  '*':
    - data
        -users

Maintenant les données seront accessible aux Minions. Pour utiliser les données Pillar dans un State, nous pourrons utiliser Jinja:

/srv/salt/users/init.sls:

{% for user, uid in pillar.get('users', {}).items() %}
{{ user }}:
  user.present:
    - uid: {{ uid }}
{% endfor %}

Cette approche permet de définir d’une manière sécurisé les utilisateurs dans un Pillar pour ensuite appliquer les données de l’utilisateur dans un fichier SLS.

Paramétrer les States avec un Pillar

Les données d’un Pillar peuvent accéssibles depuis un fichier State pour customiser le comportement de chaque Minion. Tous les données d’un Pillar (et Grains) qui sont applicables pour chaque Minion sont remplacées dans le fichier State à travers des modèles avant d’être lancées. Typiquement, il va inclure les répertoires appropriés pour le Minion et passer sur les States qu’il ne doit pas appliquer.

Un exemple simple est de configurer un plan de noms de paquets dans Pillar pour chaque distribution Linux:

/srv/pillar/pkg/init.sls:

pkgs:
  {% if grains['os_family'] == 'RedHat' %}
  apache: httpd
  vim: vim-enhanced
  {% elif grains['os_family'] == 'Debian' %}
  apache: apache2
  vim: vim
  {% elif grains['os'] == 'Arch' %}
  apache: apache
  vim: vim
  {% endif %}

Le nouveau SLS pkg doit maintenant être ajouté à notre “top file“:

/srv/pillar/top.sls:

base:
  '*':
    - data
        - users
        - pkg

A présent les Minions vont se baser automatiquements d’après leur OS dans le Pillar, donc nous pouvont paramétrer sans risque le fichier SLS:

/srv/salt/apache/init.sls:

apache:
  pkg.installed:
    - name: {{ pillar['pkgs']['apache'] }}

Par contre, si aucun Pillar n’est créé(disponible, référencé), nous pouvons le créer dans le State directement:

Note

La fonction pillar.get utilisé dans cet exemple a été ajouté dans la version 0.14.0

/srv/salt/apache/init.sls:

apache:
  pkg.installed:
    - name {{ salt['pillar.get']('pkgs:apache', 'httpd') }}

Dans cet exemple précédent, si la valeur du Pillar pillar['pkgs']['apache'] n’est pas configuré dans le Pillar du Minion, alors l’option par défaut httpd sera utilisé.

Note

Sous le capot, Pillar est simplement un dictionnaire Python, donc les méthodes du dictionnaire Python tel que get et items peuvent être utilisées.