Linux
La bonne nouvelle c'est qu'on a un outil superbe pour automatiser tout ça qui s'appelle "Ansible".
La meilleure nouvelle c'est qu'on a un superbe repository qui t'explique tout comment faire.
Voici la copie du README de ce repo
Infrastructure Ansible : Spektrum Suisse
Playbook Ansible pour provisionner et configurer l'ensemble des serveurs Ubuntu du Public Cloud de Spektrum Suisse.
Idéalement, une connaissance de Ansible est préférable. (en vrai c'est HYPER puissant)
Prérequis
- Ansible installé sur votre machine locale
sshpassinstallé (sudo apt install sshpass), requis pour la connexion SSH par mot de passe aux hôtes Windows- Clé SSH partagée de l'équipe (voir ci-dessous)
- Fichier
.vault_passà la racine du projet (contient le mot de passe Ansible Vault)
# Installer les collections requises
ansible-galaxy install -r requirements.ymlClé SSH
La clé SSH partagée pour accéder aux serveurs est stockée sur Guardian sous le nom "Ansible Spek Suisse".
# 1. Récupérer la clé privée depuis Guardian et la placer ici :
~/.ssh/spektrum_ansible
# 2. Appliquer les bonnes permissions
chmod 600 ~/.ssh/spektrum_ansible
# 3. Vérification
ansible all -m pingUtilisation
# Exécuter le playbook complet sur tous les serveurs
ansible-playbook site.yml
# Exécuter un rôle spécifique via son tag
ansible-playbook site.yml -t docker
ansible-playbook site.yml -t ldap
ansible-playbook site.yml -t alloy
ansible-playbook site.yml -t restic
ansible-playbook site.yml -t apt-monitoring
# Cibler un hôte ou un groupe
ansible-playbook site.yml -l nginx-prod
ansible-playbook site.yml -l production
ansible-playbook site.yml -l internal
# Éditer les secrets chiffrés
ansible-vault edit vars/secrets.ymlArchitecture réseau
Deux environnements, 7 serveurs au total. Connexion SSH via l'utilisateur ubuntu.
Internal
Réseau privé, accès via bastion (nginx-internal) par ProxyJump.
| Hôte | IP | Rôle |
|---|---|---|
nginx-internal | 84.234.26.160 | Bastion / reverse proxy |
staging-internal | 195.15.249.221 | Staging |
services-internal | 195.15.249.196 | Services (Grafana, Prometheus, Loki...) |
db-internal | 195.15.249.197 | Base de données |
Production
Réseau public, accès via bastion (nginx-prod) par ProxyJump.
| Hôte | IP | Rôle |
|---|---|---|
nginx-prod | 83.228.201.182 | Bastion / reverse proxy |
apps-prod | 89.47.48.11 | Applications |
db-prod | 89.47.48.14 | Base de données |
Rôles
docker
Installe Docker CE depuis le dépôt officiel. Expose le daemon Docker sur le port TCP 2375 via un override systemd. Déploie un conteneur cAdvisor sur le port 8080 pour les métriques de conteneurs.
ldap
Configure l'authentification centralisée via LDAP (ldaps://ldap.internal.spektrum-suisse.ch).
- nslcd + nsswitch : résolution des utilisateurs et groupes depuis l'annuaire LDAP
- Clés SSH : script
AuthorizedKeysCommandqui interroge l'attributsshPublicKeydans LDAP - Sécurité : authentification par mot de passe désactivée
- Provisioning : création automatique des répertoires home, ajout des membres de l'équipe aux groupes
sudoetdocker
alloy
Installe Grafana Alloy comme agent d'observabilité.
- Logs : journald,
/var/log/*, logs Docker → Loki (loki.internal.spektrum-suisse.ch) - Métriques : node exporter, cAdvisor → Prometheus (
prometheus.internal.spektrum-suisse.ch) - Métriques texte : collecte les fichiers
.promdans/var/lib/alloy/data/metrics/ - Nginx : les hôtes nginx reçoivent une config supplémentaire (
03_nginx_exporter.alloy) via la variablealloy_extra_configs
restic
Configure des sauvegardes chiffrées et incrémentales vers Infomaniak Swiss Backup (OpenStack Swift).
- Cron toutes les 15 minutes
- Rétention : 24 horaires, 7 journalières, 4 hebdomadaires, 12 mensuelles
- Exclut les données éphémères (stockage Loki/Prometheus)
- Exporte des métriques Prometheus (durée, statut, taille du dépôt, nombre de snapshots)
Important : la clé de chiffrement générée (
/data/restic/restic_key) doit être sauvegardée dans Vaultwarden. Sans elle, les sauvegardes sont irrécupérables.
apt-monitoring
Vérifie les mises à jour APT disponibles toutes les heures et écrit des métriques Prometheus dans le répertoire textfile d'Alloy.
Secrets
Le fichier vars/secrets.yml est chiffré avec Ansible Vault et contient :
| Variable | Usage |
|---|---|
vault_ldap_bind_password | Mot de passe admin LDAP |
vault_restic_username | Identifiant Infomaniak Swiss Backup |
vault_restic_password | Mot de passe Infomaniak Swiss Backup |
Structure du projet
site.yml # Playbook principal
ansible.cfg # Configuration Ansible
requirements.yml # Dépendance : community.docker
vars/secrets.yml # Secrets chiffrés (Vault)
inventory/
hosts.yml # Inventaire des hôtes et config SSH
group_vars/
all.yml # Variables globales (chemins Alloy)
internal.yml # environment_name: "internal"
production.yml # environment_name: "production"
host_vars/
nginx-internal.yml # Config nginx exporter
nginx-prod.yml # Config nginx exporter
roles/
docker/ # Docker CE + cAdvisor
ldap/ # Client LDAP + auth SSH
alloy/ # Grafana Alloy (logs + métriques)
restic/ # Sauvegardes chiffrées
apt-monitoring/ # Monitoring des mises à jour APTCommandes Claude Code
Ce projet inclut des slash commands pour Claude Code afin d'accélérer les opérations courantes :
| Commande | Description |
|---|---|
/new-role <nom> | Crée un nouveau rôle (structure complète), l'ajoute à site.yml avec son tag |
/add-host <hostname> <ip> <groupe> | Ajoute un hôte à l'inventaire avec le ProxyJump adapté au groupe |
/add-secret <vault_variable> | Guide l'ajout d'un secret au vault et met à jour la documentation |
Volumes
Les serveurs suivent la philosophie cattle not pets. Les données persistantes sont stockées sur le volume /data, monté depuis un volume Infomaniak Public Cloud.
# Vérifier le montage
df -h | grep /data
# Montage manuel si nécessaire
sudo mount /dev/sdb /dataLe montage est rendu persistant via /etc/fstab.

