
Tant que vos states vivent dans /srv/salt sur le master, rien ne trace qui
a changé quoi, et un fichier édité à la main part directement en production.
Ce module industrialise ce socle : les states servis depuis Git avec
GitFS, chaque branche devenant un environnement Salt, et des
contrôles automatiques (salt-lint, state.show_sls) avant toute
application. Public visé : intermédiaires et avancés prêts à passer du lab à
une exploitation sérieuse.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Servir les states depuis Git avec GitFS.
- Faire d'une branche Git un environnement Salt.
- Linter vos states avec
salt-lint. - Vérifier le rendu d'un SLS avant de l'appliquer.
Prérequis
Section intitulée « Prérequis »Le dépôt, avant tout
Section intitulée « Le dépôt, avant tout »Un projet Salt sain repose sur une séparation simple : l'arbre des states
(/srv/salt) et celui des pillars (/srv/pillar), chacun avec son top
file. On regroupe les states par service, avec une hiérarchie qui se lit
comme une table des matières : un lecteur devine le contenu de
mysql/server.sls avant de l'ouvrir.
Trois règles structurent ces fichiers, chacune détaillée dans un module dédié :
l'installation va dans init.sls et la configuration dans un conf.sls
séparé (voir Les states) ;
les valeurs qui changent selon la distribution vivent dans un
map.jinja ; et les
secrets restent en pillar chiffré,
jamais en grain ni en state versionné.
Tout cela ne vaut cependant que si le dépôt est la source de vérité. C'est précisément ce que GitFS impose.
GitFS : servir les states depuis Git
Section intitulée « GitFS : servir les states depuis Git »GitFS fait du master un client Git : au lieu de lire des fichiers posés à
la main dans /srv/salt, il récupère les states depuis un dépôt. Le
changement de nature est important. Modifier la production ne consiste plus à
éditer un fichier sur le master, mais à pousser un commit. Vous héritez
gratuitement de l'historique, de la relecture en merge request et du
rollback de Git.
La configuration tient en quelques lignes côté master :
fileserver_backend: - gitfs - roots
gitfs_provider: gitpythongitfs_base: maingitfs_remotes: - file:///srv/gitfs/salt.gitgitfs_base désigne la branche qui alimente l'environnement base, ici
main. Le backend roots est conservé en second : le master continue de
servir /srv/salt si un fichier n'est pas trouvé dans Git, ce qui permet une
migration progressive. Après modification, redémarrez le master, puis forcez
une synchronisation :
sudo salt-run fileserver.updateUne branche, un environnement
Section intitulée « Une branche, un environnement »C'est la propriété la plus utile de GitFS : chaque branche du dépôt devient un
environnement Salt. Une branche dev crée un environnement dev, sans aucune
configuration supplémentaire. Le master les liste :
sudo salt-run fileserver.envs- base- devLe même state, appliqué depuis deux environnements différents, sert alors le
contenu de la branche correspondante. Ici, un state motd qui pose une
bannière, appliqué depuis l'environnement base (branche main) :
sudo salt web1 state.apply motd saltenv=basesudo salt web1 cmd.run 'cat /etc/motd.d/banniere'web1: Configuration servie depuis Git (environnement base).Puis exactement la même commande, depuis l'environnement dev :
sudo salt web1 state.apply motd saltenv=devsudo salt web1 cmd.run 'cat /etc/motd.d/banniere'web1: Configuration servie depuis Git (environnement dev).Le state n'a pas changé de nom, seule la branche qui le sert diffère. Vous
tenez là un cycle de promotion naturel : on développe sur dev, on teste
avec saltenv=dev, puis on fusionne dans main pour que la production
(l'environnement base) reçoive le changement. La promotion devient une merge
request, avec sa relecture et sa trace.
Tester avant d'appliquer
Section intitulée « Tester avant d'appliquer »Un state fautif ne se voit pas au commit, il se voit en production. Trois contrôles, faciles à mettre en CI, l'évitent.
salt-lint : attraper les fautes de style et les pièges
Section intitulée « salt-lint : attraper les fautes de style et les pièges »salt-lint analyse les fichiers SLS et signale les écarts aux bonnes
pratiques. Il attrape notamment le piège classique du mode non quoté, que
YAML interpréterait comme un entier décimal au lieu d'une valeur octale :
salt-lint mauvais.sls[207] File modes should always be encapsulated in quotation marksmauvais.sls:7 - mode: 0644
[210] Numbers that start with '0' should always be encapsulated in quotation marksmauvais.sls:7 - mode: 0644Une fois le mode corrigé en "0644", l'outil ne renvoie rien et sort avec
un code 0, ce qui rend le pipeline vert. C'est exactement le
comportement attendu d'un linter en CI : silencieux quand tout va bien,
bloquant sinon.
state.show_sls : le SLS se rend-il vraiment
Section intitulée « state.show_sls : le SLS se rend-il vraiment »Un SLS peut être syntaxiquement propre et échouer au rendu : un pillar
absent, une variable Jinja indéfinie, une boucle qui produit du YAML invalide.
state.show_sls rend le state sans l'appliquer et montre le résultat
compilé :
sudo salt web1 state.show_sls motd saltenv=baseweb1: ---------- /etc/motd.d/banniere: ---------- __env__: base __sls__: motd file: ...Deux informations précieuses ici. Le state se rend (donc il compilera à
l'application), et le champ __env__ confirme quel environnement l'a
servi, ce qui lève tout doute quand plusieurs branches coexistent.
test=True : la simulation avant l'application
Section intitulée « test=True : la simulation avant l'application »Le dernier filet reste le mode simulation. test=True exécute le highstate
sans rien modifier et affiche ce qui changerait. C'est le réflexe à
prendre avant chaque application sensible :
sudo salt 'web*' state.apply test=TrueCes trois contrôles se chaînent naturellement dans un pipeline : salt-lint
sur les fichiers modifiés, state.show_sls pour vérifier le rendu, puis
test=True sur un environnement de recette avant la fusion vers main.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
fatal: detected dubious ownership in repository | Le dépôt n'appartient pas à l'utilisateur du master | chown -R salt:salt sur le dépôt, puis salt-run fileserver.update |
fileserver.envs ne montre que base | GitFS n'a pas encore récupéré les branches | Forcer salt-run fileserver.update et vérifier les logs du master |
| GitFS reste vide sans erreur côté client | Le backend roots masque le problème | Interroger salt-run fileserver.file_list backend=gitfs |
salt-lint introuvable | Installé hors de l'environnement Python courant | L'installer dans un venv dédié (Debian bloque les installs système) |
| Un changement ne remonte pas aux minions | Cache du fileserver | salt-run fileserver.update puis réappliquer |
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 »- GitFS fait du master un client Git : la production ne se modifie plus à la main, elle se pousse en commit.
- Chaque branche Git devient un environnement Salt, ciblé par
saltenv=. La promotion devient une merge request. - Le dépôt doit appartenir à l'utilisateur
salt, sinon GitFS reste silencieusement vide. salt-lintattrape les pièges classiques (mode non quoté) et bloque la CI avec un code de sortie non nul.state.show_slsprouve que le SLS se rend et révèle l'environnement qui l'a servi (__env__).test=Truereste le dernier filet : simuler avant d'appliquer.