Introduction à Salt

Attention : cet article a été rédigé en 2014 et n’a pas été mis à jour depuis. Les concepts sont restés les même mais la syntaxe a pu évoluer depuis.

Salt ?

Salt est un gestionnaire de configuration écrit en Python. Bien que focalisé  historiquement sur les systèmes Linux / BSD, il est désormais capable de gérer des systèmes Windows.

A l’origine, Salt avait pour « seul » objectif l’exécution de commandes de façon asynchrone sur plusieurs serveurs avant d’évoluer vers la gestion centralisée de configuration.

L’un de ses principaux atouts face à ses concurrents que sont Puppet et Chef (parmi tant d’autres) est qu’il a su évoluer tout en restant simple à prendre en main. Rien avoir avec le code et le DSL indigeste d’un Puppet.

Aujourd’hui en version 2014.04, Salt est une application relativement récente car son premier commit date de début 2011, soit trois ans maintenant.

Côté installation, on le retrouve sous forme de packages sur les principales distributions (Debian, Ubuntu, CentOS) dans des dépôts officiels ou communautaires. Il peut également s’installer via Pip, le gestionnaire de modules propre à Python (équivalent à Rubygems dans le monde Ruby).

Fonctionnement

Salt est composé de plusieurs composants dont les deux principaux sont :

  • Master : le serveur qui envoie les ordres aux minions
  • Minion : les serveurs qui reçoivent et exécutent les ordres

Deux autres rôles existent pour les déploiements avancés:

  • Syndic: interconnecte deux masters. Toutes les informations remontent au syndic qui est le master ayant la plus haute autorité (relation master -> slave).
  • Proxy: permet de contrôler des appareils non supportés par Salt. Cela inclut switchs, routeurs et autres équipements réseaux.

Petit schéma:

Schéma-Composants-Salt

L’authentification se fait par clés privés + publiques comme SSH sauf que la communication se fait via un protocole dédié. Petit bonus de Salt : il est également possible de passer via SSH avec quelques limitations.

Mise en place

Nous aurons à notre disposition deux machines virtuelles sous CentOS 6.5 en 64-bits :

  • Salt-master, notre… master
  • Salt-minion, notre… minion

Installation des packages

Si ce n’est déjà fait, commençons par activer le repository EPEL (indispensable) :

rpm –Uvh http://mirror.ibcp.fr/pub/epel/6/i386/epel-release-6-8.noarch.rpm

Sur notre master, on installe le package salt-master :

[root@salt-master ~]# yum install -y salt-master

Sur notre minion, on installe le package salt-minion :

[root@salt-minion ~]# yum install -y salt-minion

Communication entre le master et ses minions

Comme expliqué en introduction, Salt s’appuie sur une authentification par clé pour s’identifier auprès du master. L’enregistrement sur le master d’un nouveau minion se fait donc de la façon suivante:

2014-05-20 16_27_17-Drawing1 - Visio Professional (Product Activation Failed)

A partir du master, lançons d’abord le service salt-master pour qu’il puisse écouter les demandes d’enregistrement des minions:

[root@salt-master ~]# service salt-master start
Starting salt-master daemon: [ OK ]
[root@salt-master ~]# chkconfig salt-master on

J’en profite au passage pour lancer automatiquement le master au démarrage.

A partir du minion, ouvrons le fichier /etc/salt/minion pour dé-commenter la ligne suivante:

#master: salt

Remplacez salt par le nom d’hôte (ou l’adresse IP) du master:

master: salt-master

Pour forcer l’ID du minion envoyé au master, dé-commentez et complétez la ligne:

#id:

Une fois la modification faîtes, lancez le service salt-minion:

[root@salt-minion ~]# service salt-minion start
Starting salt-minion daemon: [ OK ]

Profitons-en pour le lancer automatiquement au démarrage:

[root@salt-minion ~]# chkconfig salt-minion on

A partir du master, nous allons maintenant accepter la clé du minion à l’aide de la commande salt-key. Listons d’abord les clés en attente:

[root@salt-master ~]# salt-key -L
Accepted Keys:
Unaccepted Keys:
salt-minion
Rejected Keys:

Nous avons ici un minion en attente: salt-minion. Pour connaître sa clé, utilisez la commande salt-key -p:

[root@salt-master ~]# salt-key -p salt-minion
Unaccepted Keys:
salt-minion: -----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5Nr7EjqhCb0DhLR/MeY1
R6vFPLmT3Zv1PcNDObypuuaq08z2LsapkDpBGVyd0XEjU0EHrifMD7Laa4UQZ3Rw
byUU0IR0BD2ndqB6veMYmq2UcKmFUo0BkxzMU1B3pbWF5/Fg2QeWtkxDC73bbwWd
SDvIQsKdOjRAnyFOKLrG4oc4V4ZiocFY0yNmvYkx2x9xOd6h2JGKjSEP8hWCeUjt
QvUJBn9gf4q5VPhMf8dOuhp6elLi6xu9khQAvzmeaVAEWmuIHE7+Dv9YO6DfBFbp
4FztI2x8QlnwlIu9a49l0oRL50aSc5sTAJGSLHKC467h+0pv5dKP7UjpzhcHy632
F8cwv0pOYLD+DxdXWh7XgpwtAXkYFvj7/2DbBfs0/3jnkVnwnZPx28ZA9HwRu0jy
REVdK8hxADZI183YvU0Chq7TH1JTcDra1B8DF8DpMIT75Sgv1jqwfZ/SjL4XplmY
CMdFxytDRX1lsuKlg+klwHQvgZrTBtzCV7a+OvQW7DEdLENgvPN7vQhqj/4370sO
44zfdC9oV7Uq2FiVKL43GX4jlJv6Bj2esRKi4dGP7+SSEHsnFAtJrjeIsIGlViMO
6sl9E83PeHkAP3JJMqZ2xPPVqdQIk7dVf/Xg95ehvHr0O3TZZWhS1s38GX1nuX7J
fI6rfsw4ayfsywJwooilLg8CAwEAAQ==
-----END PUBLIC KEY-----

Ne reste qu’à l’accepter:

[root@salt-master ~]# salt-key -a salt-minion

L’option -A en remplacement de -a permet d’accepter tous les minions en attente. A présent, notre minion est capable de communiquer avec le master.

Me recevez-vous ?

Avant de se lancer dans les states et autres pillars et grains, commençons par voir comment identifier nos minions.

Comme vous avez pu le remarquer, Salt récupère le nom d’hôte (l’ID) du minion et s’en sert pour l’identifier. C’est avec ces IDs que nous allons pouvoir lui dire: dis à tel(s) serveur(s) de faire ça.

La syntaxe de la commande salt est la suivante:

[root@salt-master ~]# salt

Même si ce n’est pas obligatoire, prenez l’habitude d’entourer votre target par des guillemets simple (c’est la documentation qui le dit ):

  • Pour sélectionner l’ensemble des minions configurés, utilisez ‘*’.
  • Pour sélectionner un seul minion, utilisez ‘son nom d’hôte‘ (exemple: ‘salt-minion’)
  • Pour sélectionner un groupe de minion, utilisez l’étoile comme dans une expression régulière: ‘web*’ tous les serveurs dont l’ID débute par web.

Débutons par un petit ping à l’ensemble de nos minions à l’aide de la fonction test.ping:

[root@salt-master ~]# salt '*' test.ping
salt-minion:
 True

Le résultat s’affiche sous la forme nom du serveur: suivi, à la ligne, de la réponse du minion. On voit ici que salt-minion, notre fidèle minion, a bien répondu au ping.

Demandons-lui à présent son uptime à l’aide de la fonction cmd.run qui permet d’exécuter n’importe quel commande shell:

[root@salt-master ~]# salt '*' cmd.run 'uptime'
salt-minion:
 16:47:52 up 45 min, 2 users, load average: 0.00, 0.00, 0.00

Chose importante à savoir sur Salt: son fonctionnement est asynchrone, ne vous étonnez donc pas de recevoir le résultat dans le désordre avec plusieurs minions, ils arrivent dans l’ordre dans lequel les serveurs envoient leurs réponses.

Si le serveur est éteint ou ne répond pas, vous ne recevrez tout simplement pas de réponse et Salt ignorera le serveur dans les résultats (il ne sera pas listé). Pour être sûr d’avoir les résultats pour l’ensemble des serveurs enregistrés, utilisez au choix l’option –verbose ou —-show-timeout:

[root@salt-master ~]# salt --show-timeout '*' cmd.run 'uptime'
salt-minion:
 Minion did not return

Liste des fonctions

Salt est livré avec une (énorme) liste de fonctions pour gagner du temps et vous éviter de programmer en Python ou d’écrire des commandes shell à rallonge. Pour toutes les lister, utilisez la fonction sys.doc. Celle-ci va vous retourner l’ensemble des fonctions disponibles avec une petite description pour chaque:

[root@salt-master ~]# salt '*' sys.doc
(8804 lignes vont s'afficher)

Remplacez l’étoile par un nom d’hôte / ID pour récupérer la liste des fonctions supportées par un serveur.

Pour obtenir de l’aide sur une fonction, passez comme argument le nom de la fonction:

[root@salt-master ~]# salt '*' sys.doc pkg.version
pkg.version:

 Returns a string representing the package version or an empty string if not
 installed. If more than one package name is specified, a dict of
 name/version pairs is returned.

 CLI Example:

 salt '*' pkg.version
 salt '*' pkg.version    ...

Un catalogue des modules est consultable sur le site de Salt: http://docs.saltstack.com/en/latest/salt-modindex.html.

Prochain billet: les states.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s