alliance-boreale/ansible
Dan Allaire 3e438623c7
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
Devis des artéfacts à produire
2025-11-01 18:07:06 -04:00
..
inventories/production Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
playbooks Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
roles Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
vault Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
ansible.cfg Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
devis phases 2.5 et 3.md Devis des artéfacts à produire 2025-11-01 18:07:06 -04:00
README-PHASE2.md Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00
README.md Premiers rôles ansible et leurs playbooks de déploiement (Phases 1 et 2) 2025-11-01 17:57:46 -04:00

🌲 Alliance Boréale - Ansible Automation

Infrastructure as Code pour L'Alliance Boréale - Membre: Chezlepro Inc.

📋 Table des matières


🔧 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


🆘 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)