Skip to content

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
  • sshpass installé (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)
bash
# Installer les collections requises
ansible-galaxy install -r requirements.yml

Clé SSH

La clé SSH partagée pour accéder aux serveurs est stockée sur Guardian sous le nom "Ansible Spek Suisse".

bash
# 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 ping

Utilisation

bash
# 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.yml

Architecture 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ôteIPRôle
nginx-internal84.234.26.160Bastion / reverse proxy
staging-internal195.15.249.221Staging
services-internal195.15.249.196Services (Grafana, Prometheus, Loki...)
db-internal195.15.249.197Base de données

Production

Réseau public, accès via bastion (nginx-prod) par ProxyJump.

HôteIPRôle
nginx-prod83.228.201.182Bastion / reverse proxy
apps-prod89.47.48.11Applications
db-prod89.47.48.14Base 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 AuthorizedKeysCommand qui interroge l'attribut sshPublicKey dans 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 sudo et docker

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 .prom dans /var/lib/alloy/data/metrics/
  • Nginx : les hôtes nginx reçoivent une config supplémentaire (03_nginx_exporter.alloy) via la variable alloy_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 :

VariableUsage
vault_ldap_bind_passwordMot de passe admin LDAP
vault_restic_usernameIdentifiant Infomaniak Swiss Backup
vault_restic_passwordMot 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 APT

Commandes Claude Code

Ce projet inclut des slash commands pour Claude Code afin d'accélérer les opérations courantes :

CommandeDescription
/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.

bash
# Vérifier le montage
df -h | grep /data

# Montage manuel si nécessaire
sudo mount /dev/sdb /data

Le montage est rendu persistant via /etc/fstab.

Contributors

The avatar of contributor named as Clément Favre Clément Favre

Changelog