=============
= Saltstack =
=============

Salt ou SaltStack est un logiciel de gestion de configuration écrit en Python, fonctionnant sur le principe client-serveur.
Salt a pour but de rendre la gestion de configuration simple et flexible.
Il s'agit d'une alternative à Puppet, Ansible et Chef.
(Wikipédia)

Les communications entre clients et serveurs sont basées sur une bibliothèque de messagerie asynchrone haute performance appelée ZeroMQ.
Les clients sont appelés "les minions" et le serveur (voire les serveurs) est appelé "master".
Les échanges entre minions et masters sont entièrement cryptés.
Les ports par défaut utilisés par Saltstack sont les ports 4505 et 4506.

En 2020, le projet a été acquis par VMware. La gestion des minions peut se faire avec les outils de "vRealize Automation SaltStack Config".
Saltstack peut s'installer sur une variété d'OS : BSD, MAC, Linux, Solaris, Windows.



========================
Installation du Master :
========================

Sur une nouvelle machine Debian qui jouera le rôle de master (Pour l'installation de la machine Debian, utiliser les consignes du dossier "01. Install/").

Coordonnées du master :
- OS : Debian 12
- Hostname (fqdn) : salt.postfo.lan
- IP : 10.0.x.33
- SSH : accessibilité de l'utilisateur 'root' via SSH.


Installation de SaltStack depuis les dépôts du projet :
-------------------------------------------------------
Installer 'curl' :
# apt install curl

Importer la clef du dépôt SaltStack :
# curl -fsSL -o /etc/apt/keyrings/salt-archive-keyring-2023.gpg https://repo.saltproject.io/salt/py3/debian/12/amd64/SALT-PROJECT-GPG-PUBKEY-2023.gpg

Créer le fichier /etc/apt/sources.list :
# echo "deb [signed-by=/etc/apt/keyrings/salt-archive-keyring-2023.gpg arch=amd64] https://repo.saltproject.io/salt/py3/debian/12/amd64/latest bookworm main" | tee /etc/apt/sources.list.d/salt.list

Synchroniser avec les dépôts :
# apt update

Installer le paquet 'salt-master' :
# apt install salt-master

Modifier la 15ème ligne du fichier /etc/salt/master afin d'indiquer l'adresse IP de l'interface à utiliser par le master :
"interface: 10.0.x.33"

Redémarrer le service :
# systemctl restart salt-master

Nous venons d'installer salt-master sur la machine.  Cela permettra de gérer les différents minions.
Il est également possible d'installer salt-minion sur le master.



==========================
Installation des minions :
==========================

Sur Fedora 38 :
---------------
Importer la clef du dépôt SaltStack :
# rpm --import https://repo.saltproject.io/salt/py3/fedora/38/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub

Créer le fichier d'accès au dépôt :
# curl -fsSL https://repo.saltproject.io/salt/py3/fedora/38/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo

Synchroniser avec les dépôts :
# dnf update

Installer le paquet 'salt-minion' :
# dnf install salt-minion

Modifier la 16ème ligne du fichier /etc/salt/minion afin d'indiquer l'adresse IP du master :
"master: 10.0.x.33"

Activer le service au démarrage et le démarrer :
# systemctl enable --now salt-minion


Sur Rocky Linux 8 :
-------------------
Importer la clef du dépôt SaltStack :
# rpm --import https://repo.saltproject.io/salt/py3/redhat/8/x86_64/SALT-PROJECT-GPG-PUBKEY-2023.pub

Créer le fichier d'accès au dépôt :
# curl -fsSL https://repo.saltproject.io/salt/py3/redhat/8/x86_64/latest.repo | tee /etc/yum.repos.d/salt.repo

Synchroniser avec les dépôts :
# dnf update

Installer le paquet 'salt-minion' :
# dnf install salt-minion

Modifier la 16ème ligne du fichier /etc/salt/minion afin d'indiquer l'adresse IP du master :
"master: 10.0.x.33"

Activer le service au démarrage et le démarrer :
# systemctl enable --now salt-minion


Sur Windows :
------------
Installer salt-minion sur une machine Windows du réseau :

Télécharger l'installateur depuis la page  https://docs.saltproject.io/salt/install-guide/en/latest/topics/install-by-operating-system/windows.html  et l'installer.


Autres systèmes d'exploitation :
--------------------------------
Voir  https://docs.saltproject.io/salt/install-guide/en/latest/topics/install-by-operating-system/index.html



===================
Post-Installation :
===================

Une fois le master et les minions installés, le master doit autoriser les différents minions via leur clef d'identification :

Sur le Master :
---------------
Afficher la clef d'identification du master :
# salt-key -F master

Afficher la liste des différents minions et leur clef :
# salt-key -L

Autoriser l'ensemble des minions en acceptant leur clef :
# salt-key -A

En passant le paramètre "-a", en minuscule, on peut autoriser un seul minion à la fois.
Une fois les minions acceptés, il est maintenant possible de gérer leur configuration et leur état depuis le master.

Relancer la commande "salt-key -L" afin de constater que les différents minions ont été acceptés.



==================
Remote Execution :
==================

Le premier mode par lequel il est possible de gérer les minions est le mode d'exécution à distance.


Commandes 'Salt' :
------------------
Saltstack dispose de ses propres commandes afin de gérer les minions.

La commande 'test.ping' permet de lister les minions présents et joignables (l'étoile signifie l'ensemble des minions) :
# salt '*' test.ping


Quelques commandes utiles pour l'administration d'un parc informatique :

Lister les mises à jour disponibles sur chaque minion :
# salt '*' pkg.list_upgrades

Effectuer les mises à jour :
# salt '*' pkg.upgrade

Installer le paquet 'openssh-server':
# salt '*' pkg.install openssh-server

Les différents paramètres possibles pour le module 'pkg' de gestion des paquets sont nombreux.
Pour obtenir la liste :
# salt '*' sys.doc pkg

La documentation de ce module est également disponible sur internet :
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.pkg.html


La liste des différents modules et leur documentation est disponible à l'adresse : 
https://docs.saltproject.io/en/latest/py-modindex.html


Ciblage des minions :
---------------------
Il y a de nombreuses méthodes pour cibler des mignons :

- les 'grains' (caractéristiques communes à une machine ou un groupe de machines).
- les listes d'IDs
- les IPs ou Subnets
- une méthode composée ("compound") de méthodes précédentes
- les groupes ('node groups'). Ils doivent être préalablement créés par l'administrateur.

Concernant les grains :
Pour demander l'ID des différents minions connectés : 
# salt '*' grains.get id

Pour demander les IP des différents minions connectés : 
# salt '*' grains.get ipv4

Pour afficher la liste complète des différents grains spécifiques à chaque minion :
# salt '*' grains.items


Exemples :
----------
Cibler plusieurs minions par liste d'IDs (-L) :
# salt -L 'glpi.postfo.lan,mail.postfo.lan' test.ping

Cibler un minion par son IP (-S) :
# salt -S '10.0.x.30' test.ping

On peut également cibler un minion par son IP en utilisant la méthode des grains (-G) :
# salt -G 'ipv4:10.0.x.31' test.ping

Utiliser la méthode composée ('Compound') pour cibler des minions à l'aide de plusieurs méthodes (-C) :
# salt -C 'glpi.postfo.lan or S@10.0.x.31 or S@10.0.x.32' test.ping

Autres exemples, cibler les minions selon l'OS installé (méthode des grains) :
# salt -G 'os:Fedora' test.ping
# salt -G 'os:Debian' test.ping
# salt -G 'os:Rocky' test.ping


Commandes Linux :
-----------------
Il est également possible de lancer directement des commandes linux sur les minions en utilisant le module 'cmd.run'.

Par exemple, pour créer un nouvel utilisateur et définir son mot de passe sur les minions dont l'OS est Debian :
# salt -G 'os:Debian' cmd.run "useradd -m -c 'postfo2025' postfo2025  -s /bin/bash"
# salt -G 'os:Debian' cmd.run "echo 'postfo2025:postfo2025' | chpasswd"


Gestion des minions Windows :
-----------------------------
Sur le Master :

Installer 'git' et 'python3-git' :
# apt install git python3-git

Créer un dossier pour accueillir les fichiers de définition des programmes installables :
# mkdir /srv/salt/
# chown salt:salt /srv/salt/

Lancer la commande de synchronisation au dépôt :
# salt-run winrepo.update_git_repos      [--->  Bug! : Des WARNINGS s'affichent mais la commande réussit ]

Rafraîchir la liste des programmes installables sur les minions :
# salt -G 'os:Windows' pkg.refresh_db


Une série de programmes peuvent être installés : 7zip, ccleaner, chrome, firefox_x64, jre8, node.js, npp_x64, teamviewer, vscode, vlc, ...

Installer 7-zip sur l'ensemble des minions Windows :
# salt -G 'os:Windows' pkg.install 7zip

Désinstaller 7-zip sur l'ensemble des minions Windows :
# salt -G 'os:Windows' pkg.remove 7zip


Pour lister les programmes installés :
# salt -G 'os:Windows' pkg.list_pkgs


Documentation :
https://docs.saltproject.io/en/latest/topics/windows/index.html



================
Etats / States :
================

Un autre mode de contrôle/configuration des minions est celui des états.

Quelques exemples et tutoriels :

https://media.readthedocs.org/pdf/install-saltstack/latest/install-saltstack.pdf
https://ansible-cn.readthedocs.io/en/stable/topics/tutorials/index.html#states



============
Références :
============

Site :             https://saltproject.io/

Documentation :    https://docs.saltproject.io/en/latest/contents.html
                   https://docs.vmware.com/en/VMware-vRealize-Automation-SaltStack-Config/index.html



=======
Utile :
=======

Cheat Sheet :      https://github.com/eon01/SaltStackCheatSheet