
Un parc n'est jamais homogène : distributions différentes, rôles variés. Les grains sont la réponse de Salt : des faits collectés côté minion qui décrivent chaque machine, exploitables pour cibler et brancher vos déploiements. Ce module apprend à déployer automatiquement selon le système d'exploitation et le rôle. Public visé : intermédiaires ayant pratiqué les states et le ciblage.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Lire les grains système d'un minion.
- Définir des grains personnalisés (rôle, environnement).
- Cibler et brancher des states selon les grains.
Prérequis
Section intitulée « Prérequis »- Savoir écrire des states et connaître le ciblage.
Les grains système
Section intitulée « Les grains système »Au démarrage, chaque minion collecte des dizaines de faits : os,
os_family, osrelease, cpuarch, mem_total, fqdn, adresses IP. Ces
grains système sont disponibles partout, dans le ciblage comme dans les
states. La fonction grains.item en lit une sélection :
salt 'web1' grains.item os os_family osrelease cpuarchweb1: ---------- cpuarch: x86_64 os: Debian os_family: Debian osrelease: 13grains.items affiche tout, grains.get os_family renvoie une seule
valeur. Ces faits pilotent ensuite les décisions : grains['os_family'] dans un
state permet de choisir le bon paquet ou le bon chemin selon la distribution.
Les grains personnalisés
Section intitulée « Les grains personnalisés »Les grains système décrivent la machine, mais pas son rôle métier. On ajoute
alors des grains personnalisés : role: web, environnement: prod. Ils se
définissent dans le fichier /etc/salt/grains du minion, dans sa configuration,
ou dynamiquement. Ce sont eux qui rendent un top file lisible et un ciblage
stable.
# /etc/salt/grains sur le minionrole: webenvironnement: prodAprès modification, un salt 'web1' saltutil.sync_grains ou un redémarrage du
minion recharge les grains. On les relit comme les autres :
salt 'web1' grains.get roleweb1: webCibler par grain
Section intitulée « Cibler par grain »Le drapeau -G sélectionne les minions par grain. Un grain de rôle vise une
fonction métier ; un grain système vise une famille de machines. Sur un parc
où seul un serveur porte le rôle web :
salt -G 'role:web' test.pingweb1: TrueLe même mécanisme avec un grain système rassemble toute une famille d'OS, ici trois machines Debian :
salt -G 'os_family:Debian' test.pingproxy1: Trueweb1: Truedb1: TrueC'est ce ciblage qui remplace les exceptions machine par machine : vous décrivez une intention (« les serveurs web », « les hôtes Debian »), pas une liste.
Cas pratique : un serveur web selon l'OS
Section intitulée « Cas pratique : un serveur web selon l'OS »Assemblons les deux idées. Un state unique installe le bon serveur web selon
la famille d'OS du minion, grâce à grains['os_family'] évalué en Jinja. La
syntaxe {% ... %} est le gabarit Jinja, détaillé au
module 7 ; retenez
ici seulement qu'elle lit un grain pour décider. Sur une machine Debian il
posera apache2, sur une machine RedHat httpd, sans que vous ayez à écrire une
exception.
{# le paquet du serveur web dépend de la famille d'OS du minion #}{% set pkg = "apache2" if grains["os_family"] == "Debian" else "httpd" %}
serveur_web: pkg.installed: - name: {{ pkg }} service.running: - name: {{ pkg }} - enable: true - require: - pkg: serveur_webPlutôt que d'installer réellement un second serveur web sur une machine du parc,
simulons le rendu avec test=True : Salt résout le grain, montre ce qu'il
ferait, sans rien modifier. C'est le réflexe à prendre avant toute application.
sudo salt web1 state.apply webserver test=True ID: serveur_web Function: pkg.installed Name: apache2 Result: None Comment: The following packages would be installed/updated: apache2---------- ID: serveur_web Function: service.running Name: apache2 Result: None Comment: Service apache2 not present; if created in this state run, it would have been startedLe Result: None et le conditionnel « would be installed » confirment que
le grain os_family de web1 (Debian) a bien été résolu en apache2 : sur
une machine RedHat, le même state aurait affiché httpd. Rien n'est installé, la
cible reste intacte. C'est ce branchement par grain qui remplace les
exceptions machine par machine.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Un grain personnalisé n'apparaît pas | Grains non rechargés | salt '<minion>' saltutil.sync_grains ou redémarrer le minion |
-G 'role:web' ne cible personne | Grain absent ou mal orthographié | Vérifier /etc/salt/grains et grains.get role |
grains['os_family'] lève une erreur en Jinja | Grain inexistant sur la cible | Utiliser grains.get('os_family', 'Debian') avec repli |
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Les grains sont des faits du minion, collectés à son démarrage.
- Les grains système (
os_family,osrelease) adaptent le déploiement à la machine. - Les grains personnalisés (
role,environnement) rendent ciblage et top file lisibles. - Le drapeau
-Gcible les minions par grain, système ou personnalisé. - Fait non secret pour le ciblage : grain. Donnée sensible : pillar.