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-2
etsalt-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
date
whoami
hostname
bash /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/states
Les pillars sont dans
/srv/salt/pillars
Les 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/redis
etrole/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 :
bob
puisse exécuter le modulepkg
sur toutes les machinesalice
puisse exécuter le moduletest.ping
partout, maispkg
seulement sursalt-minion-3
.
Formulas#
Déployez un serveur Apache en utilisant la formula correspondante : saltstack-formulas/apache-formula