Aller au contenu
Infrastructure as Code medium

Commandes distantes Salt : cibler les minions, grains et batch

11 min de lecture

Une fois le master et les minions en place, la première superpuissance de Salt est l'exécution distante : lancer une commande sur des dizaines de serveurs et lire tous les retours d'un coup. Ce guide vous apprend à cibler exactement les bons minions avec les matchers, à exécuter des modules idempotents comme pkg et service, puis à limiter l'impact d'une action avec l'exécution par batch. Public visé : administrateurs ayant déjà un master et des minions opérationnels.

  • Construire une commande Salt : cible plus fonction.
  • Cibler les minions par glob, liste, grains et expressions composées.
  • Exécuter des modules utiles : cmd, pkg, service.
  • Limiter le rayon d'action avec --batch.
  • Lire et interpréter les retours de tout le parc.
  • Un master et au moins deux minions opérationnels. Si ce n'est pas encore le cas, suivez d'abord Découvrir Salt.
  • Les minions de cet exemple s'appellent web1, db1 et proxy1, et portent chacun un grain role (respectivement web, db, proxy).

Toute commande d'exécution suit la même structure : salt suivi d'une cible, puis d'une fonction de module, puis d'éventuels arguments.

Fenêtre de terminal
sudo salt '<cible>' <module>.<fonction> [arguments]

La cible décide quels minions reçoivent l'ordre. La fonction appartient à un module d'exécution (test, cmd, pkg, service, grains et des centaines d'autres). Comprendre le ciblage est ce qui sépare une commande utile d'une commande dangereuse : viser '*' pour un simple test est sain, mais viser '*' pour redémarrer un service peut couper tout le parc.

La cible par défaut est un glob sur l'identifiant du minion. Mais Salt propose des matchers bien plus précis. Le tableau ci-dessous résume les plus utiles, puis chaque forme est illustrée sur le lab.

MatcherOptionVise...
Glob(défaut)Les identifiants correspondant au motif
Liste-LUne liste explicite d'identifiants
Grain-GLes minions dont un fait correspond
Composé-CUne combinaison logique de matchers
Nodegroup-NUn groupe nommé défini sur le master

Le glob filtre sur le nom du minion. Un motif web* ne retient que les serveurs web :

Fenêtre de terminal
sudo salt 'web*' test.ping
web1:
True

Quand les noms n'ont pas de motif commun, l'option -L énumère les cibles :

Fenêtre de terminal
sudo salt -L 'web1,db1' test.ping
web1:
True
db1:
True

C'est le ciblage le plus portable. L'option -G vise les minions selon un fait : leur système, leur architecture ou un rôle que vous leur avez attribué. Viser tous les serveurs Debian, quel que soit leur nom :

Fenêtre de terminal
sudo salt -G 'os_family:Debian' test.ping
web1:
True
db1:
True
proxy1:
True

Le ciblage par rôle est encore plus parlant, car il ne dépend ni du nom ni de la distribution :

Fenêtre de terminal
sudo salt -G 'role:web' test.ping
web1:
True

L'option -C combine plusieurs matchers avec des opérateurs logiques (and, or, not). Un grain se préfixe alors par G@. Viser les serveurs web ou ceux dont le rôle est db :

Fenêtre de terminal
sudo salt -C 'web* or G@role:db' test.ping
db1:
True
web1:
True

Répéter la même expression composée à chaque commande devient vite pénible. Un nodegroup nomme une expression de ciblage une seule fois dans la configuration du master, puis se réutilise avec -N. C'est la façon recommandée de figer des cibles récurrentes, sans dupliquer la logique.

/etc/salt/master.d/nodegroups.conf
nodegroups:
webservers: 'G@role:web'
donnees: 'G@role:db or G@role:proxy'

Après un redémarrage du master, chaque groupe se cible par son nom :

Fenêtre de terminal
sudo salt -N webservers test.ping
web1:
True

Salt expose des centaines de modules d'exécution. Trois reviennent en permanence au quotidien.

cmd.run exécute une commande brute et rapatrie sa sortie. Pratique pour une information ponctuelle :

Fenêtre de terminal
sudo salt '*' cmd.run 'grep PRETTY_NAME /etc/os-release'
web1:
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
db1:
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
proxy1:
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"

pkg est idempotent et multi-distributions : il installe un paquet seulement s'il manque. Installons Nginx sur les seuls serveurs web :

Fenêtre de terminal
sudo salt -G 'role:web' pkg.install nginx
web1:
----------
nginx:
----------
new:
1.26.3-3+deb13u7
old:
nginx-common:
----------
new:
1.26.3-3+deb13u7
old:

Le champ old vide et new renseigné signalent une installation. Rejouons exactement la même commande :

Fenêtre de terminal
sudo salt -G 'role:web' pkg.install nginx
web1:
----------

Le retour vide prouve l'idempotence : le paquet étant déjà présent, Salt ne fait rien. C'est toute la différence avec un cmd.run 'apt install nginx', qui relancerait apt à chaque fois.

service gère l'état des services. Vérifions que Nginx tourne bien après l'installation :

Fenêtre de terminal
sudo salt -G 'role:web' service.status nginx
web1:
True

Redémarrer un service sur tout le parc en même temps peut provoquer une coupure totale. L'option --batch applique la commande par vagues : Salt n'agit que sur un nombre (ou un pourcentage) de minions à la fois et attend que chaque vague réponde avant de continuer.

Fenêtre de terminal
sudo salt '*' --batch 2 test.ping
Executing run on ['proxy1', 'web1']
proxy1:
True
web1:
True
Executing run on ['db1']
db1:
True

Salt traite ici deux minions, attend leur réponse, puis passe au dernier. Vous pouvez exprimer la taille de vague en valeur absolue (--batch 2) ou en pourcentage (--batch 25%). Sur un service en frontal, ce réflexe évite l'indisponibilité générale : si une vague échoue, vous arrêtez avant d'avoir cassé l'ensemble.

Chaque minion renvoie un résultat structuré, affiché sous son identifiant. Pour un test.ping, c'est un simple True ; pour pkg.install, c'est un arbre décrivant les changements. En mode batch, Salt ajoute des métadonnées utiles : le jid (identifiant de job) et le retcode (0 si tout va bien).

Le jid permet de retrouver le résultat d'un job plus tard, même si votre terminal s'est fermé :

Fenêtre de terminal
sudo salt-run jobs.lookup_jid <jid>

Un minion absent de la réponse (« Minion did not return ») n'a pas répondu dans le délai imparti : il est peut-être hors ligne, surchargé, ou en cours de ré-authentification. Le runner manage.up liste les minions réellement joignables pour lever le doute.

Par défaut, Salt affiche un format lisible à l'œil. Pour automatiser, demandez du JSON ou du YAML avec l'option --out : le résultat devient directement exploitable par jq ou n'importe quel script.

Fenêtre de terminal
sudo salt --out=json 'web1' grains.item os osrelease
{
"web1": {
"os": "Debian",
"osrelease": "13"
}
}

Le format YAML est plus compact pour une valeur simple :

Fenêtre de terminal
sudo salt --out=yaml 'web1' test.ping
web1: true

Le ciblage est un sujet de sécurité. Trois principes limitent les dégâts.

Tester la cible avant d'agir. Lancez d'abord un test.ping sur votre expression de ciblage : vous voyez exactement quels minions seraient touchés avant d'exécuter une action destructive.

Batcher les opérations à risque. Tout redémarrage ou reconfiguration en frontal passe par --batch, jamais en une seule salve sur '*'.

Restreindre qui peut publier. En production, tout le monde ne doit pas pouvoir lancer n'importe quelle commande sur n'importe quelle cible. Salt offre des ACL de publication côté master pour cadrer qui exécute quoi ; c'est un sujet du guide d'exploitation en production.

SymptômeCause probableSolution
No minions matched the targetMotif ou grain erronéVérifier l'expression ; lister les grains avec grains.items
Un minion manque dans la réponseHors ligne ou délai dépassésalt-run manage.up, vérifier le service salt-minion
cmd.run rejoue à chaque foisCommande non idempotenteUtiliser un module dédié (pkg, service)
Ciblage -G sans résultatGrain absent sur les minionsVérifier salt '*' grains.get role
Le batch avance trop lentementVague trop petiteAugmenter --batch (valeur ou pourcentage)
  1. Une commande Salt = une cible plus une fonction de module.
  2. Les matchers ciblent par glob ('web*'), liste (-L), grain (-G) ou expression composée (-C).
  3. Le ciblage par grains est portable : il survit au renommage et se transpose d'un parc à l'autre.
  4. Préférer les modules idempotents (pkg, service) au cmd.run brut : le second passage de pkg.install ne change rien.
  5. --batch protège les services en frontal en appliquant la commande par vagues.

Le prochain module, Les states, fait le saut du déclaratif : décrire une fois l'état voulu d'un serveur au lieu d'enchaîner des commandes.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn