# Ansible — Commandes d'administration Toutes les commandes se lancent depuis la racine du repo (`Funk-lab/`). Le venv est dans `.venv/`, le `Makefile` fournit les raccourcis. --- ## Playbooks et rôles Deux playbooks, un par machine (le `site.yml` les enchaîne) : ### `playbooks/storage-01.yml` — hosts `gateway` (15 rôles) | Rôle | Tag | Ce qu'il gère | |---|---|---| | `hermes_user` | `hermes_user` | User `hermes` + clés SSH partagées entre hosts | | `common` | `common` | Paquets de base, sécurité, NTP | | `gateway` | `gateway` | nftables + NAT (routeur du LAN cluster) | | `dnsmasq` | `dnsmasq` | DNS local `lab.local` + wildcard → Traefik | | `nfs_server` | `nfs_server` | Exports NFS (modèles LLM, volumes k8s) | | `qdrant` | `qdrant` | Base vectorielle (RAG) — `:6333` | | `postgresql` | `postgresql` | PG 16 — bases hermes, litellm, n8n, openwebui, grafana | | `minio` | `minio` | Stockage objet S3 | | `litellm` | `litellm` | Proxy LLM `:4000` + script `ask-agent` | | `hermes_agent` | `hermes_agent` | Agent Hermes + skills + souls | | `rag` | `rag` | Scripts `rag-ingest` / `rag-query` + docs RAG | | `node_exporter` | `node_exporter` | Métriques Prometheus | | `alertmanager_webhook` | `alertmanager_webhook` | Pont AlertManager → ask-agent `:9093` | | `postfix_relay` | `postfix_relay` | SMTP sortant via Gmail (App Password) | | `hermes_auto_improve` | `hermes_auto_improve` | Worker analyse doc + trigger server `:9095` (schedulé par n8n à 22h) | ### `playbooks/gpu-01.yml` — hosts `gpu_hosts` (6 rôles) | Rôle | Tag | Ce qu'il gère | |---|---|---| | `hermes_user` | `hermes_user` | User `hermes` (clé partagée avec storage-01) | | `common` | `common` | Paquets de base, sécurité, NTP | | `rocm` | `rocm` | Stack GPU AMD (ROCm 7.x, `HSA_OVERRIDE_GFX_VERSION=10.3.0`) | | `nfs_client` | `nfs_client` | Montage `/mnt/models` depuis storage-01 | | `llama_server` | `llama_server` | llama-server ×3 : GPU `:1234`, CPU `:1236`/`:1237` | | `node_exporter` | `node_exporter` | Métriques Prometheus (+ rocm power) | > ⚠️ Le rôle `lm_studio` existe encore dans `ansible/roles/` mais n'est référencé par **aucun** playbook (remplacé par `llama_server` en mai 2026). Candidat à la suppression. ### Caveat premier déploiement — `hermes_agent` Sur un hôte vierge, il faut **deux runs consécutifs** : le premier installe le binaire (`curl | bash`), le second applique la config (conditionnelle à l'existence du binaire). --- ## Raccourcis Makefile ```bash make ping # Vérifie que toutes les machines répondent make check # Dry-run complet (simule sans appliquer) make apply # Applique tous les playbooks (storage-01 + gpu-01) make apply-storage # Applique uniquement storage-01 make apply-gpu # Applique uniquement gpu-01 make install # Installe ansible-core + collections Galaxy make vault-encrypt # Chiffre group_vars/all/vault.yml make vault-edit # Édite le vault (déchiffre → édite → rechiffre) make vault-view # Affiche le contenu du vault déchiffré ``` --- ## Commandes Ansible directes ### Cibler un rôle spécifique ```bash cd ansible/ # Via tag (si les rôles ont des tags) ../.venv/bin/ansible-playbook playbooks/storage-01.yml --tags dnsmasq # Via limite d'hôte ../.venv/bin/ansible-playbook playbooks/site.yml -l gpu-01 ``` ### Exécuter une commande ad-hoc sur une machine ```bash cd ansible/ ../.venv/bin/ansible storage-01 -m shell -a "systemctl status dnsmasq" ../.venv/bin/ansible all -m shell -a "uptime" ../.venv/bin/ansible gpu_hosts -m shell -a "free -h" ``` ### Collecter les facts d'une machine (variables système détectées) ```bash cd ansible/ ../.venv/bin/ansible storage-01 -m setup ../.venv/bin/ansible storage-01 -m setup -a "filter=ansible_interfaces" ../.venv/bin/ansible storage-01 -m setup -a "filter=ansible_default_ipv4" ``` ### Vérifier l'inventaire ```bash cd ansible/ ../.venv/bin/ansible-inventory --list # JSON complet ../.venv/bin/ansible-inventory --graph # Arbre des groupes/hôtes ``` ### Dry-run avec diff (voir exactement ce qui changerait) ```bash cd ansible/ ../.venv/bin/ansible-playbook playbooks/storage-01.yml --check --diff ``` ### Débugger une variable ```bash cd ansible/ ../.venv/bin/ansible storage-01 -m debug -a "var=lan_interface" ../.venv/bin/ansible storage-01 -m debug -a "var=hostvars['storage-01']" ``` ### Augmenter la verbosité (debug complet) ```bash cd ansible/ ../.venv/bin/ansible-playbook playbooks/storage-01.yml -v # output étendu ../.venv/bin/ansible-playbook playbooks/storage-01.yml -vvv # connexions SSH incluses ``` --- ## Vault Ansible ```bash # Chiffrer un fichier cd ansible/ ../.venv/bin/ansible-vault encrypt group_vars/all/vault.yml # Chiffrer une valeur à la volée (copier-coller dans vault.yml) ../.venv/bin/ansible-vault encrypt_string 'mon_mot_de_passe' --name 'vault_postgres_password' # Déchiffrer temporairement pour voir ../.venv/bin/ansible-vault view group_vars/all/vault.yml # Changer le mot de passe vault ../.venv/bin/ansible-vault rekey group_vars/all/vault.yml ``` --- ## Groupes d'hôtes disponibles | Groupe | Machines | |---|---| | `all` | storage-01, gpu-01 | | `gateway` | storage-01 | | `gpu_hosts` | gpu-01 | | `almalinux` | storage-01, gpu-01 |