Salt : Un outil de gestion d'infra

Publié le ven. 03 août 2012 par Gaston Tjebbes
Translations: en

Introduction

Salt est un outil de gestion de configuration pour votre infrastructure informatique programmé en Python.

Il fonctionne sur la base de deux services :

  • salt-master (le serveur)
  • salt-minion (l'agent)

Tout au long de cet article, nous nous référons à une configuration simple comportant deux systèmes :

nom d'hôte rôle adresse IP
captain master salt 192.168.122.1
seaman minion salt 192.168.122.2

Installation sur Debian

Mise à jour du 21 mars 2013: de nouvelles versions de Salt corrigent des bogues critiques, sont incompatibles avec les précédentes et ne peuvent être installées via le gestionnaire de paquets de Debian

Instructions obsolètes

L'installation est extrêmement simple, Salt étant packagé. Exécuter :

  • sur le Master (captain) :
captain:~$ apt-get install salt-master
  • sur le ou les Minions (ici seaman) :
seaman:~$ apt-get install salt-minion

Instructions à jour

Pour le master (ici captain):

curl -L http://bootstrap.saltstack.org | sh -s -- -P  -M -N stable

Pour les minions (ici seaman) :

curl -L http://bootstrap.saltstack.org | sh -s -- -P  stable

Communication entre Master et Minion

Communication

La communication se fait par un système de clés (et est chiffrée en md5 par défaut). La bibliothèque ZeroMQ est utilisée pour la couche réseau.

Identification

Le Minion identifie le Master par son nom (salt par défaut) ou son adresse IP, afin d'accepter ses instructions.

Le Master identifie le Minion par le nom d'hôte de ce dernier.

Il est ensuite possible de cibler les Minions par critère (OS, regexp, cpuarch…), ce qui permet de préciser les machines auxquelles seront destinées les instructions.

Configuration minimale

Sur le Minion

Configuration de l'adresse IP du master dans /etc/salt/minion :

master:192.168.122.1

Redémarrage du service :

seaman:~$ service salt-minion restart

Sur le Master

Configuration de l'interface sur laquelle on écoute dans /etc/salt/master :

interface:192.168.122.1

Redémarrage du service :

captain:~$ service salt-master restart

Pour lister les clés disponibles :

captain:~$ salt-key -L

On doit voir apparaître le hostname du Minion. Pour valider la clé :

captain:~$ salt-key -a <hostname> #(ou salt-key -A pour faire simple)

Une fois la clé validée, on peut lancer les premières instructions via la commande salt.

captain:~$ salt '*' test.ping
captain:~$ salt '*' cmd.run "touch /tmp/unfichier"
captain:~$ salt '*' cmd_exec python "import sys; print sys.version"

Les fichiers d'état

Les fichiers d'état sont une représentation de ce qu'un serveur devrait être, ils permettent à salt de devenir un gestionnaire de configuration. On peut ainsi définir un ensemble d'états correlés (un service doit être actif une fois que le paquet est installé)

Par défaut ces fichiers se trouvent dans /srv/salt/.

Le format par défaut est Yaml couplé avec du templating jinja mais d'autres formats sont disponibles, et on peut même concevoir le sien.

Exemple de base

On veut installer Apache sur toutes les Debian et toutes les Fedora du parc. On crée un fichier /srv/salt/top.sls :

base:
    'os:Debian':
         - webserver
    'os:Fedora':
        - webserver

On utilise ici l'OS comme condition d'installation : créons un fichier webserver.sls :

apache:
     pkg.installed:
      {% if grains['os'] == 'Fedora' %}
          - name: httpd
      {% elif grains['os'] == 'Debian' %}
          - name: apache2
      {% endif %}
     service.running:
          {% if grains['os'] == 'Fedora' %}
          - name: httpd
          {% elif grains['os'] == 'Debian' %}
          - name: apache2
          {% endif %}
          - require:
            - pkg: apache

Reste à lancer :

captain:~$ salt '*' state.highstate

Ce qu'il reste à explorer

  • Les modules (apache, pkg, libvirt, mysql, ...) que l'on appelle depuis la commande salt.
  • Les state modules (qui peuvent être utilisés directement dans les fichiers .sls).
  • Les fichiers qui vont permettre de templatiser des fichiers de configuration.