411 lines
8.6 KiB
Markdown
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)
|