alliance-boreale/ansible/README.md
Dan Allaire bb38f846cd
Some checks are pending
CI / yaml-lint (push) Waiting to run
CI / ssot-export (push) Waiting to run
CI / tests (push) Waiting to run
CI / docs (push) Waiting to run
Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2)
2025-11-01 17:57:46 -04:00

411 lines
8.6 KiB
Markdown

# 🌲 Alliance Boréale - Ansible Automation
Infrastructure as Code pour L'Alliance Boréale - Membre: **Chezlepro Inc.**
## 📋 Table des matières
- [Prérequis](#prérequis)
- [Structure du projet](#structure-du-projet)
- [Configuration initiale](#configuration-initiale)
- [Phase 1 : DNS Fédéré](#phase-1--dns-fédéré)
- [Gestion des secrets](#gestion-des-secrets)
- [Commandes utiles](#commandes-utiles)
- [Dépannage](#dépannage)
---
## 🔧 Prérequis
### Sur votre machine de contrôle
```bash
# Ubuntu/Debian
sudo apt update
sudo apt install ansible python3-pip sshpass
# OU via pip (recommandé pour dernière version)
pip3 install ansible ansible-lint
# Collections Ansible requises
ansible-galaxy collection install community.general
ansible-galaxy collection install community.postgresql
ansible-galaxy collection install ansible.posix
```
### Sur les serveurs cibles (VMs)
- Ubuntu 22.04 LTS ou Debian 12
- Accès root temporaire (sera désactivé après)
- Connexion SSH fonctionnelle
---
## 📁 Structure du projet
```
ansible/
├── ansible.cfg # Configuration Ansible
├── README.md # Ce fichier
├── inventories/
│ └── production/
│ ├── hosts.yml # Inventaire des serveurs
│ └── group_vars/
│ ├── all.yml # Variables globales
│ └── dns_servers.yml # Variables DNS
├── roles/
│ ├── common/ # Hardening de base
│ ├── postgresql/ # Base de données
│ └── powerdns-authoritative/ # DNS autoritaire
├── playbooks/
│ └── phase1-dns-deploy.yml # Déploiement Phase 1
└── vault/
└── production.yml # Secrets chiffrés (à créer)
```
---
## ⚙️ Configuration initiale
### 1. Générer clés SSH
```bash
# Générer une paire de clés pour Ansible
ssh-keygen -t ed25519 -f ~/.ssh/alliance_boreale_ed25519 -C "ansible@chezlepro.ca"
# Copier la clé publique sur les serveurs (temporairement en root)
ssh-copy-id -i ~/.ssh/alliance_boreale_ed25519.pub root@10.0.2.10
ssh-copy-id -i ~/.ssh/alliance_boreale_ed25519.pub root@10.0.2.11
```
### 2. Configurer l'inventaire
Éditer `inventories/production/hosts.yml` :
```yaml
# Remplacer les IPs par vos IPs publiques/internes
ns1.infra.chezlepro.ca:
ansible_host: <IP_PUBLIQUE_NS1> # ← MODIFIER ICI
ns2.infra.chezlepro.ca:
ansible_host: <IP_PUBLIQUE_NS2> # ← MODIFIER ICI
```
Éditer `inventories/production/group_vars/all.yml` :
```yaml
# Ajouter vos clés SSH publiques
ssh:
authorized_keys:
- "ssh-ed25519 AAAAC3... votre-email@example.com" # ← AJOUTER ICI
```
### 3. Créer le vault de secrets
```bash
# Créer un mot de passe pour le vault
ansible-vault create vault/production.yml
```
Contenu du vault :
```yaml
---
# Secrets pour Phase 1
vault_pdns_api_key: "changeme-api-key-secure-random"
vault_postgresql_pdns_password: "changeme-db-password-secure-random"
```
**Sauvegarder le mot de passe vault dans un gestionnaire de mots de passe !**
### 4. Tester la connectivité
```bash
# Ping tous les hôtes
ansible all -m ping
# Devrait afficher:
# ns1.infra.chezlepro.ca | SUCCESS => { "ping": "pong" }
# ns2.infra.chezlepro.ca | SUCCESS => { "ping": "pong" }
```
---
## 🚀 Phase 1 : DNS Fédéré
### Déploiement complet
```bash
# Déployer Phase 1 complète
ansible-playbook playbooks/phase1-dns-deploy.yml --ask-vault-pass
# OU avec fichier mot de passe
echo "votre-mot-de-passe-vault" > .vault_pass
chmod 600 .vault_pass
ansible-playbook playbooks/phase1-dns-deploy.yml --vault-password-file .vault_pass
```
### Déploiement par étapes (tags)
```bash
# Seulement hardening (common)
ansible-playbook playbooks/phase1-dns-deploy.yml --tags common
# Seulement PostgreSQL
ansible-playbook playbooks/phase1-dns-deploy.yml --tags postgresql
# Seulement PowerDNS
ansible-playbook playbooks/phase1-dns-deploy.yml --tags powerdns
# Mode dry-run (vérifier sans appliquer)
ansible-playbook playbooks/phase1-dns-deploy.yml --check --diff
```
### Déploiement sur un seul serveur
```bash
# Seulement ns1
ansible-playbook playbooks/phase1-dns-deploy.yml --limit ns1.infra.chezlepro.ca
# Seulement ns2
ansible-playbook playbooks/phase1-dns-deploy.yml --limit ns2.infra.chezlepro.ca
```
---
## 🔐 Gestion des secrets
### Éditer le vault
```bash
# Éditer secrets
ansible-vault edit vault/production.yml
# Voir contenu (sans éditer)
ansible-vault view vault/production.yml
# Changer mot de passe vault
ansible-vault rekey vault/production.yml
```
### Générer mots de passe sécurisés
```bash
# API Key PowerDNS (32 caractères alphanumériques)
openssl rand -base64 32
# Mot de passe PostgreSQL
openssl rand -base64 24
```
---
## 🧪 Validation post-déploiement
### Tests DNS
```bash
# Résolution SOA
dig @10.0.2.10 chezlepro.ca SOA +short
# Résolution NS
dig @10.0.2.10 chezlepro.ca NS +short
# Test DNSSEC
dig @10.0.2.10 chezlepro.ca DNSKEY +dnssec
# Test depuis Internet (après propagation)
dig @8.8.8.8 chezlepro.ca SOA +short
```
### Export DS Records (DNSSEC)
```bash
# Se connecter au DNS master
ssh ansible@10.0.2.10
# Exporter DS records
sudo pdnsutil show-zone chezlepro.ca | grep DS
# Exemple output:
# chezlepro.ca IN DS 12345 13 2 abc123...
```
**Ajouter ces DS records chez votre registraire de domaine !**
### Validation DNSSEC publique
```bash
# Avec DNSViz (après ajout DS records)
# https://dnsviz.net/d/chezlepro.ca/dnssec/
# Ou en ligne de commande
delv @8.8.8.8 chezlepro.ca SOA
# Devrait afficher: "fully validated"
```
### Vérifier services
```bash
# SSH sur serveur
ssh ansible@10.0.2.10
# Status PowerDNS
sudo systemctl status pdns
# Status PostgreSQL
sudo systemctl status postgresql
# Logs PowerDNS
sudo journalctl -u pdns -f
# Firewall rules
sudo nft list ruleset
# API PowerDNS (depuis le serveur)
curl -H "X-API-Key: <votre-api-key>" http://127.0.0.1:8081/api/v1/servers/localhost
```
---
## 🛠️ Commandes utiles
### Ansible ad-hoc
```bash
# Mettre à jour tous les packages
ansible all -b -m apt -a "upgrade=dist update_cache=yes"
# Redémarrer un service
ansible dns_servers -b -m systemd -a "name=pdns state=restarted"
# Collecter facts
ansible all -m setup
# Exécuter commande shell
ansible all -b -a "uptime"
```
### Gestion PowerDNS
```bash
# Lister zones
pdnsutil list-all-zones
# Ajouter un record
pdnsutil add-record chezlepro.ca www A 203.0.113.10 3600
# Supprimer un record
pdnsutil delete-rrset chezlepro.ca www A
# Rectifier zone (après modifications)
pdnsutil rectify-zone chezlepro.ca
# Augmenter serial SOA
pdnsutil increase-serial chezlepro.ca
# Vérifier zone
pdnsutil check-zone chezlepro.ca
```
---
## 🐛 Dépannage
### Erreur: "Failed to connect to the host"
```bash
# Vérifier connectivité
ping 10.0.2.10
# Vérifier SSH manuel
ssh -i ~/.ssh/alliance_boreale_ed25519 ansible@10.0.2.10
# Vérifier port SSH
nmap -p 22 10.0.2.10
```
### Erreur: "Permission denied (publickey)"
```bash
# Vérifier que la clé est chargée
ssh-add -l
# Ajouter la clé si nécessaire
ssh-add ~/.ssh/alliance_boreale_ed25519
# Vérifier authorized_keys sur le serveur
ssh root@10.0.2.10 "cat /home/ansible/.ssh/authorized_keys"
```
### Erreur: "Vault password required"
```bash
# Option 1: Demander interactivement
--ask-vault-pass
# Option 2: Fichier
--vault-password-file .vault_pass
# Option 3: Variable d'environnement
export ANSIBLE_VAULT_PASSWORD_FILE=.vault_pass
```
### PowerDNS ne démarre pas
```bash
# Voir logs détaillés
sudo journalctl -u pdns -n 100 --no-pager
# Vérifier config
sudo pdns_server --config-check
# Tester connexion PostgreSQL
sudo -u postgres psql powerdns -c "SELECT * FROM domains;"
```
### DNS ne répond pas
```bash
# Vérifier que le port est ouvert
sudo ss -tulnp | grep :53
# Vérifier firewall
sudo nft list ruleset | grep "53"
# Tester en local d'abord
dig @127.0.0.1 chezlepro.ca SOA
# Ensuite depuis l'extérieur
dig @<IP_PUBLIQUE> chezlepro.ca SOA
```
---
## 📚 Documentation de référence
- [Nomenclature v4 (CRB-2)](../00_Nomenclature_biomimetique_autopoietique_v4_CRB2.md)
- [Document 05: Opération DNS Fédérée](/mnt/project/05_Operation_DNS_Federee.md)
- [Document 14: Structure YAML Registraire](/mnt/project/14_Structure_YAML_Registraire.md)
- [PowerDNS Documentation](https://doc.powerdns.com/authoritative/)
- [Ansible Documentation](https://docs.ansible.com/)
---
## 🆘 Support
Pour questions ou problèmes :
1. Consulter les logs : `sudo journalctl -u pdns -f`
2. Vérifier la documentation dans `/mnt/project/`
3. Contacter Cercle Opérationnel via Matrix
---
**Version:** 1.0
**Date:** 2025-10-31
**Membre:** Chezlepro Inc.
**Phase:** 1 (DNS Fédéré - C1-C2)