| .. | ||
| inventories/production | ||
| playbooks | ||
| roles | ||
| vault | ||
| ansible.cfg | ||
| devis phases 2.5 et 3.md | ||
| README-PHASE2.md | ||
| README.md | ||
🌲 Alliance Boréale - Ansible Automation
Infrastructure as Code pour L'Alliance Boréale - Membre: Chezlepro Inc.
📋 Table des matières
- Prérequis
- Structure du projet
- Configuration initiale
- Phase 1 : DNS Fédéré
- Gestion des secrets
- Commandes utiles
- Dépannage
🔧 Prérequis
Sur votre machine de contrôle
# 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
# 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 :
# 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 :
# 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
# Créer un mot de passe pour le vault
ansible-vault create vault/production.yml
Contenu du vault :
---
# 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é
# 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
# 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)
# 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
# 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
# É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
# 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
# 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)
# 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
# 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
# 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
# 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
# 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"
# 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)"
# 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"
# 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
# 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
# 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)
- Document 05: Opération DNS Fédérée
- Document 14: Structure YAML Registraire
- PowerDNS Documentation
- Ansible Documentation
🆘 Support
Pour questions ou problèmes :
- Consulter les logs :
sudo journalctl -u pdns -f - Vérifier la documentation dans
/mnt/project/ - Contacter Cercle Opérationnel via Matrix
Version: 1.0
Date: 2025-10-31
Membre: Chezlepro Inc.
Phase: 1 (DNS Fédéré - C1-C2)