Exercices Salt#
Prise en main de l’environnement d’exercices#
L’environnement d’exercice est basé sur des conteneurs docker. Quatre conteneurs sont déployés : 1 master et 3 minion (deux minion Debian et un minion Ubuntu).
Se placer dans le répertoire d’exercice et lancer la commande pour déployer l’environnement d’exercice :
docker compose up -d
Se connecter à un conteneur avec l’une des commandes suivantes :
docker compose exec salt-master bash
docker compose exec salt-minion-1 bash
docker compose exec salt-minion-2 bash
docker compose exec salt-minion-3 bash
Exécuter une commande salt :
salt --version
Premier contact#
Modifier la configuration du salt-minion-1 afin que celui-ci se connecte au master.
Ne pas oublier de redémarrer le minion afin que la configuration soit prise en compte.
Sur le salt-master, acceptez la clé du minion.
Sur le master, utiliser salt '*' test.ping pour vous assurer que le minion est bien
connecté au master.
Reproduire la même chose pour connecter les autres minions, ainsi que le minion situé sur la machine salt-master.
Commandes via salt-master#
Grains#
Listez les grains disponibles sur les minions avec le module grains.
Ciblage#
Exécutez la commande test.ping en ciblant sur le minion_id :
tous les minions
les minions dont le nom commence par
salt-minion-les minions
salt-minion-2etsalt-minion-3
Exécutez la commande test.ping en ciblant sur les grains :
Les minions qui ont comme système d’exploitation Ubuntu
Copier des fichiers#
Créez le fichier /tmp/hello_world.sh sur le master avec le contenu suivant :
#!/bin/bash
echo "$(hostname): Hello world!"
puis copiez-le sur tous les minions en utilisant salt-cp.
Exécuter des commandes#
Utilisez cmd.run pour exécuter des commandes sur toutes les machines
datewhoamihostnamebash /tmp/hello_world.sh
Utilisez cmd.script pour déployer et exécuter le script hello_world.sh.
Installer des paquets#
Installez tree en utilisant cmd.run
Installez htop en utilisant pkg.install.
Utiliser des modules d’exécution#
Parcourez la liste des modules d’exécution et identifier des modules d’intérêt.
États (states)#
Installer et configurer des paquets#
Écrivez un state editor.sls pour que vim et vim-addon-manager soient installés.
Appliquez cet état aux minion 1 et 2 avec le module state.apply, puis exécutez
une commande vous permettant d’afficher la version de vim installée sur chacun des
minions.
Déployez un fichier .vimrc avec le contenu ci-dessous en le décrivant dans le fichier
d’état editor.sls :
" generated by salt
set background=dark
syntax on
filetype plugin indent on
set tabstop=2 softtabstop=2 expandtab shiftwidth=2 smarttab
set modeline
set nocompatible
let g:sls_use_jinja_syntax = 1
Écrivez un top.sls qui applique le state editor à toutes les
machines.
Écrivez un state redis.sls qui installe le paquet redis et modifiez le
top.sls pour qu’il ne soit installé que sur le minion numéro 1.
Optionnel : Écrivez un state qui installe Nginx sur le salt-minion-2 à partir des
[entrepôts officiels](https://nginx.org/en/linux_packages.html) en utilisant
le module pkgrepo.
Optionnel : Écrivez un state qui désinstalle Nginx et s’assure que l’entrepôt est supprimé
des sources apt.
Dépendances entre les états#
Utilisez require pour ajouter une dépendance entre les états afin que vim
soit installé avant que le fichier .vimrc soit déployé.
Connaître les modules d’état existants#
Parcourez la liste des modules d’état et identifiez des modules d’intérêt.
Paramétrer les états avec Jinja#
Gestion des clés SSH#
Rajoutez les clés publiques SSH de alice, bob et carole dans le fichier
/root/.ssh/authorized_keys de tous les minions afin qu’ils et elles puissent se connecter
avec le compte root sur les machines.
Les clés SSH sont dans le répertoire /opt/ssh_keys du master
Utilisez une boucle for pour éviter les répétitions.
Assurez-vous que les clés de eve et mallory ne sont pas présentes dans le
fichier /root/.ssh/authorized_keys des minion.
Gestion de fichiers#
Déployez le fichier .vimrc précédent pour bob, alice et root.
Assurez-vous que le fichier .vimrc appartient à chaque utilisateur/groupe et
que les permissions sont fixées à 600.
Déployez le .vimrc pour tous les utilisateurs d’un système en
utilisant user.list_users et user.info pour filtrer les
utilisateurs non-système (p.ex. en vérifiant qu’un utilisateur a un répertoire
dans /home).
Optionnel : Déployer un fichier index.html dans le dossier html du dossier personnel de
chaque utilisateurs de la machine salt-minion-2.
<!DOCTYPE html>
<html>
<body>
<h1>Alice</h1>
<p>Bonjour, je m'appelle Alice</p>
</body>
</html>
Utilisez un template Jinja2 pour personnaliser le fichier en fonction de l’utilisateur.
Le répertoire html et le fichier devront avoir les bons propriétaires.
Optionnel : Déployer le fichier bashrc pour l’utilisateur root en utilisant une variable
color pour la couleur du prompt. Cette variable est à définir dans le state.
# Managed by Salt
# define basic colors
NO_COLOR="\[\033[0m\]"
RED="\[\033[0;31m\]"
GREEN="\[\033[0;32m\]"
BLUE="\[\033[0;34m\]"
CYAN="\[\033[0;36m\]"
# set a fancy prompt
export PS1="${RED}\u@\h${NO_COLOR}:${CYAN}\w${RED}#${NO_COLOR} "
# Aliases
alias ls="ls -h --color"
alias ll="ls -l"
alias la="ls -a"
alias lla="ls -la"
alias l="ls -1"
Déployer également ce bashrc dans les home de tous les utilisateurs en configurant
la couleur du prompt et le symbole à la fin du prompt.
root: rouge et#alice: bleu et>bob: la couleur par défaut et>
Configuration du salt-master#
Configurer le salt-master pour que :
Les states sont dans
/srv/salt/statesLes pillars sont dans
/srv/salt/pillarsLes pillars sont fusionnés plutôt que remplacés.
Pillars#
Séparer les états et les valeurs des paramètres#
Créez un pillar nommé ssh_users qui permet de configurer les utilisateurs autorisés ou
interdit à se connecter avec le compte root.
authorized_users:
- alice
- bob
- carole
denied_users:
- eve
- mallory
Reformulez le state ssh pour qu’il utilise des valeurs du pillar.
Définir des rôles et des groupes de minions#
Créez les pillars role/editor, role/nginx et role/redis.
# exemple pour le rôle editor
role:
- editor
Utilisez le top.sls pour envoyer les pillars :
role/editor: sur tous les minionsrole/nginx: sur salt-minion-1role/redis: sur salt-minion-2role/redisetrole/nginx: sur salt-minion-3
Modifiez le top.sls des states pour appliquer les states
redis, editor et nginx aux machines qui ont les rôles correspondant.
Ne diffuser que les informations nécessaires#
Créez des pillars credentials/prod et credentials/recette qui contiennent les
couples identifiants/mots de passe suivants :
prod:azerty123
recette:qwerty789
Le mot de passe de prod ne doit être accessible que sur le salt-minion-1 et le
salt-minion-2. Le mot de passe recette ne doit être accessible que sur
le salt-minion-3.
Utilisez ces pillars pour écrire un fichier .password dans /root. Ce
fichier devra être lisible seulement par l’utilisateur root.
prod:azerty123
Sur les minions 1 et 2 et
recette:qwerty789
sur le minion 3.
Contrôle des job IDs#
Simuler une commande longue (salt "*" cmd.run 'sleep 10m'), puis, faire ctrl-c
pour arrêter l’exécution.
Listez les jobs actifs avec le runner jobs.active.
Arrêtez les jobs avec le module saltutil.term_job.
Relancer la commande avec l’option --async.
Publisher ACL#
Configurer publisher_acl pour que :
bobpuisse exécuter le modulepkgsur toutes les machinesalicepuisse exécuter le moduletest.pingpartout, maispkgseulement sursalt-minion-3.
Formulas#
Déployez un serveur Apache en utilisant la formula correspondante : saltstack-formulas/apache-formula