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 et salt-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 minions

  • role/nginx : sur salt-minion-1

  • role/redis : sur salt-minion-2

  • role/redis et role/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 module pkg sur toutes les machines

  • alice puisse exécuter le module test.ping partout, mais pkg seulement sur salt-minion-3.

Formulas#

Déployez un serveur Apache en utilisant la formula correspondante : saltstack-formulas/apache-formula