diff --git a/backups_ansible.sh b/backups_ansible.sh new file mode 100644 index 0000000..acb7d60 --- /dev/null +++ b/backups_ansible.sh @@ -0,0 +1,665 @@ +#!/bin/bash +# Script de sauvegarde Ansible vers partage Samba via rsync +# Auteur: Script généré par Claude +# Date: $(date +%Y-%m-%d) +set -euo pipefail + +# ============================================================================= +# CONFIGURATION +# ============================================================================= + +# Configuration Ansible +ANSIBLE_HOME="/etc/ansible" +ANSIBLE_CONFIG_FILE="/etc/ansible/ansible.cfg" +ANSIBLE_INVENTORY_DIR="/etc/ansible/inventories" +ANSIBLE_PLAYBOOKS_DIR="/opt/ansible/playbooks" +ANSIBLE_ROLES_DIR="/opt/ansible/roles" +ANSIBLE_COLLECTIONS_DIR="/usr/share/ansible/collections" +ANSIBLE_VARS_DIR="/opt/ansible/group_vars" +ANSIBLE_HOST_VARS_DIR="/opt/ansible/host_vars" +ANSIBLE_VAULT_DIR="/opt/ansible/vault" +ANSIBLE_USER="ansible" +ANSIBLE_LOG_DIR="/var/log/ansible" + +# Chemins alternatifs courants pour Ansible +ALT_ANSIBLE_DIR="/home/ansible" +ALT_PLAYBOOKS_DIR="/home/ansible/playbooks" +ALT_ROLES_DIR="/home/ansible/roles" +ALT_INVENTORY_DIR="/home/ansible/inventory" + +# Configuration du partage Samba +SAMBA_SERVER="192.168.77.230" +SAMBA_SHARE="/srv/samba/partage/Backups" +SAMBA_USER="root" + +# Configuration SSH +SSH_KEY_PATH="$HOME/.ssh/ansible_backup_ed25519" +SSH_OPTIONS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR" + +# Configuration de sauvegarde +BACKUP_BASE_DIR="/tmp/ansible_backup_$(date +%Y%m%d_%H%M%S)" +REMOTE_BACKUP_DIR="ansible_backups" +LOG_FILE="/var/log/ansible_backup.log" +RETENTION_DAYS=30 + +# Options de sauvegarde +BACKUP_PLAYBOOKS=true # Sauvegarder les playbooks +BACKUP_ROLES=true # Sauvegarder les rôles +BACKUP_INVENTORIES=true # Sauvegarder les inventaires +BACKUP_COLLECTIONS=true # Sauvegarder les collections installées +BACKUP_VAULT=true # Sauvegarder les fichiers vault (chiffrés) +BACKUP_LOGS=true # Sauvegarder les logs Ansible +COMPRESS_COLLECTIONS=true # Compresser les collections pour économiser l'espace + +# ============================================================================= +# FONCTIONS UTILITAIRES +# ============================================================================= + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" +} + +error_exit() { + log "ERREUR: $1" + exit 1 +} + +check_root() { + if [[ $EUID -ne 0 ]]; then + error_exit "Ce script doit être exécuté en tant que root" + fi +} + +check_command() { + if ! command -v "$1" &> /dev/null; then + return 1 + fi + return 0 +} + +# ============================================================================= +# INSTALLATION DES DÉPENDANCES +# ============================================================================= + +install_dependencies() { + log "Vérification et installation des dépendances..." + + # Détecter la distribution + if [[ -f /etc/debian_version ]]; then + DISTRO="debian" + PKG_MANAGER="apt-get" + PACKAGES="rsync samba-client cifs-utils openssh-client ansible jq sqlite3 gzip tar" + elif [[ -f /etc/redhat-release ]]; then + DISTRO="redhat" + PKG_MANAGER="yum" + PACKAGES="rsync cifs-utils openssh-clients ansible jq sqlite gzip tar" + else + error_exit "Distribution non supportée" + fi + + log "Distribution détectée: $DISTRO" + + # Mise à jour du cache des paquets + if [[ "$DISTRO" == "debian" ]]; then + apt-get update -qq + fi + + # Installation des paquets manquants + for package in $PACKAGES; do + if [[ "$DISTRO" == "debian" ]]; then + if ! dpkg -l | grep -q "^ii $package "; then + log "Installation de $package..." + apt-get install -y -qq "$package" || log "Impossible d'installer $package (peut-être optionnel)" + else + log "$package est déjà installé" + fi + elif [[ "$DISTRO" == "redhat" ]]; then + if ! rpm -q "$package" >/dev/null 2>&1; then + log "Installation de $package..." + yum install -y "$package" || log "Impossible d'installer $package (peut-être optionnel)" + else + log "$package est déjà installé" + fi + fi + done +} + +# ============================================================================= +# GESTION DES CERTIFICATS SSH +# ============================================================================= + +setup_ssh_key() { + log "Configuration de la clé SSH ED25519..." + + if [[ ! -f "$SSH_KEY_PATH" ]]; then + log "Création de la clé SSH ED25519..." + ssh-keygen -t ed25519 -f "$SSH_KEY_PATH" -N "" -C "ansible-backup-$(hostname)" + chmod 600 "$SSH_KEY_PATH" + chmod 644 "${SSH_KEY_PATH}.pub" + + log "Clé SSH créée: $SSH_KEY_PATH" + log "Clé publique: ${SSH_KEY_PATH}.pub" + echo + log "IMPORTANT: Vous devez copier cette clé publique sur le serveur distant:" + log "==========================================" + cat "${SSH_KEY_PATH}.pub" + log "==========================================" + echo + log "Commande pour copier la clé sur le serveur distant:" + log "ssh-copy-id -i $SSH_KEY_PATH ${SAMBA_USER}@${SAMBA_SERVER}" + echo + read -p "Appuyez sur Entrée une fois la clé configurée sur le serveur distant..." + else + log "Clé SSH existante trouvée: $SSH_KEY_PATH" + fi +} + +test_ssh_connection() { + log "Test de la connexion SSH..." + if ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" "echo 'Connexion SSH réussie'" 2>/dev/null; then + log "Connexion SSH: OK" + else + error_exit "Impossible de se connecter via SSH. Vérifiez la configuration de la clé." + fi +} + +# ============================================================================= +# DÉTECTION DE L'ENVIRONNEMENT +# ============================================================================= + +detect_environment() { + log "Détection de l'environnement Ansible..." + + # Détection d'Ansible + ANSIBLE_INSTALL_TYPE="none" + if check_command ansible; then + ANSIBLE_INSTALL_TYPE="system" + ANSIBLE_VERSION=$(ansible --version | head -n1 | cut -d' ' -f2) + log "Ansible détecté: installation système (version $ANSIBLE_VERSION)" + elif check_command ansible-playbook; then + ANSIBLE_INSTALL_TYPE="playbook-only" + log "Ansible détecté: ansible-playbook uniquement" + else + log "ATTENTION: Ansible non détecté" + fi + + # Détection des répertoires Ansible existants + DETECTED_DIRS="" + + # Vérification des répertoires standards + if [[ -d "$ANSIBLE_HOME" ]]; then + DETECTED_DIRS="$DETECTED_DIRS $ANSIBLE_HOME" + log "Répertoire Ansible standard trouvé: $ANSIBLE_HOME" + fi + + if [[ -d "$ALT_ANSIBLE_DIR" ]]; then + DETECTED_DIRS="$DETECTED_DIRS $ALT_ANSIBLE_DIR" + log "Répertoire Ansible alternatif trouvé: $ALT_ANSIBLE_DIR" + fi + + # Adaptation des chemins selon l'environnement détecté + if [[ -f "$ALT_ANSIBLE_DIR/ansible.cfg" ]]; then + ANSIBLE_CONFIG_FILE="$ALT_ANSIBLE_DIR/ansible.cfg" + log "Configuration Ansible trouvée: $ANSIBLE_CONFIG_FILE" + fi + + if [[ -d "$ALT_PLAYBOOKS_DIR" ]]; then + ANSIBLE_PLAYBOOKS_DIR="$ALT_PLAYBOOKS_DIR" + log "Répertoire playbooks trouvé: $ANSIBLE_PLAYBOOKS_DIR" + fi + + if [[ -d "$ALT_ROLES_DIR" ]]; then + ANSIBLE_ROLES_DIR="$ALT_ROLES_DIR" + log "Répertoire rôles trouvé: $ANSIBLE_ROLES_DIR" + fi + + if [[ -d "$ALT_INVENTORY_DIR" ]]; then + ANSIBLE_INVENTORY_DIR="$ALT_INVENTORY_DIR" + log "Répertoire inventaire trouvé: $ANSIBLE_INVENTORY_DIR" + fi + + # Détection de la configuration active + if check_command ansible-config; then + log "Analyse de la configuration Ansible..." + ACTIVE_CONFIG=$(ansible-config dump 2>/dev/null | grep -E "(DEFAULT_ROLES_PATH|DEFAULT_HOST_LIST|DEFAULT_LOG_PATH)" || true) + if [[ -n "$ACTIVE_CONFIG" ]]; then + echo "$ACTIVE_CONFIG" > /tmp/ansible_active_config.txt + log "Configuration active sauvegardée" + fi + fi +} + +# ============================================================================= +# FONCTIONS DE SAUVEGARDE +# ============================================================================= + +create_backup_structure() { + log "Création de la structure de sauvegarde: $BACKUP_BASE_DIR" + mkdir -p "$BACKUP_BASE_DIR"/{playbooks,roles,inventories,collections,config,vault,logs,metadata} +} + +backup_playbooks() { + log "Sauvegarde des playbooks Ansible..." + + if [[ "$BACKUP_PLAYBOOKS" == "true" && -d "$ANSIBLE_PLAYBOOKS_DIR" ]]; then + log "Sauvegarde du répertoire playbooks: $ANSIBLE_PLAYBOOKS_DIR" + rsync -av --progress "$ANSIBLE_PLAYBOOKS_DIR/" "$BACKUP_BASE_DIR/playbooks/" \ + --exclude="*.log" --exclude=".git" --exclude="__pycache__" --exclude="*.pyc" + + # Création d'un index des playbooks + find "$ANSIBLE_PLAYBOOKS_DIR" -name "*.yml" -o -name "*.yaml" | \ + sed "s|^$ANSIBLE_PLAYBOOKS_DIR/||" > "$BACKUP_BASE_DIR/metadata/playbooks_index.txt" + else + log "Aucun répertoire playbooks trouvé ou sauvegarde désactivée" + fi + + # Recherche de playbooks dans d'autres emplacements courants + for dir in "/opt/ansible" "/home/ansible" "$HOME/ansible" "/usr/local/ansible"; do + if [[ -d "$dir/playbooks" && "$dir/playbooks" != "$ANSIBLE_PLAYBOOKS_DIR" ]]; then + log "Sauvegarde de playbooks additionnels: $dir/playbooks" + mkdir -p "$BACKUP_BASE_DIR/playbooks/additional/$(basename "$dir")" + rsync -av --progress "$dir/playbooks/" "$BACKUP_BASE_DIR/playbooks/additional/$(basename "$dir")/" \ + --exclude="*.log" --exclude=".git" --exclude="__pycache__" + fi + done +} + +backup_roles() { + log "Sauvegarde des rôles Ansible..." + + if [[ "$BACKUP_ROLES" == "true" && -d "$ANSIBLE_ROLES_DIR" ]]; then + log "Sauvegarde du répertoire rôles: $ANSIBLE_ROLES_DIR" + rsync -av --progress "$ANSIBLE_ROLES_DIR/" "$BACKUP_BASE_DIR/roles/" \ + --exclude="*.log" --exclude=".git" --exclude="__pycache__" --exclude="*.pyc" + + # Création d'un index des rôles avec leur structure + find "$ANSIBLE_ROLES_DIR" -name "main.yml" -o -name "main.yaml" | \ + while read -r role_main; do + role_name=$(echo "$role_main" | sed "s|$ANSIBLE_ROLES_DIR/||" | cut -d'/' -f1) + role_type=$(echo "$role_main" | cut -d'/' -f-2 | tail -c +$((${#ANSIBLE_ROLES_DIR}+2))) + echo "$role_name: $role_type" + done > "$BACKUP_BASE_DIR/metadata/roles_structure.txt" 2>/dev/null || true + else + log "Aucun répertoire rôles trouvé ou sauvegarde désactivée" + fi + + # Sauvegarde des rôles système si disponibles + SYSTEM_ROLES_DIR="/usr/share/ansible/roles" + if [[ -d "$SYSTEM_ROLES_DIR" && "$SYSTEM_ROLES_DIR" != "$ANSIBLE_ROLES_DIR" ]]; then + log "Sauvegarde des rôles système: $SYSTEM_ROLES_DIR" + rsync -av --progress "$SYSTEM_ROLES_DIR/" "$BACKUP_BASE_DIR/roles/system/" \ + --exclude="*.log" --exclude=".git" + fi +} + +backup_inventories() { + log "Sauvegarde des inventaires Ansible..." + + if [[ "$BACKUP_INVENTORIES" == "true" ]]; then + # Inventaire principal + if [[ -d "$ANSIBLE_INVENTORY_DIR" ]]; then + log "Sauvegarde du répertoire inventaire: $ANSIBLE_INVENTORY_DIR" + rsync -av --progress "$ANSIBLE_INVENTORY_DIR/" "$BACKUP_BASE_DIR/inventories/" \ + --exclude="*.log" --exclude=".git" + fi + + # Fichiers d'inventaire courants + for inv_file in "/etc/ansible/hosts" "/etc/ansible/inventory" "$HOME/ansible/inventory" \ + "$ALT_ANSIBLE_DIR/hosts" "$ALT_ANSIBLE_DIR/inventory"; do + if [[ -f "$inv_file" ]]; then + log "Sauvegarde du fichier inventaire: $inv_file" + cp "$inv_file" "$BACKUP_BASE_DIR/inventories/$(basename "$inv_file")_$(date +%Y%m%d)" + fi + done + + # Variables de groupe et d'hôte + if [[ -d "$ANSIBLE_VARS_DIR" ]]; then + log "Sauvegarde des variables de groupe..." + rsync -av --progress "$ANSIBLE_VARS_DIR/" "$BACKUP_BASE_DIR/inventories/group_vars/" + fi + + if [[ -d "$ANSIBLE_HOST_VARS_DIR" ]]; then + log "Sauvegarde des variables d'hôte..." + rsync -av --progress "$ANSIBLE_HOST_VARS_DIR/" "$BACKUP_BASE_DIR/inventories/host_vars/" + fi + else + log "Sauvegarde des inventaires désactivée" + fi +} + +backup_collections() { + log "Sauvegarde des collections Ansible..." + + if [[ "$BACKUP_COLLECTIONS" == "true" ]]; then + # Collections système + if [[ -d "$ANSIBLE_COLLECTIONS_DIR" ]]; then + log "Sauvegarde des collections système: $ANSIBLE_COLLECTIONS_DIR" + if [[ "$COMPRESS_COLLECTIONS" == "true" ]]; then + log "Compression des collections en cours..." + tar -czf "$BACKUP_BASE_DIR/collections/system_collections.tar.gz" \ + -C "$(dirname "$ANSIBLE_COLLECTIONS_DIR")" "$(basename "$ANSIBLE_COLLECTIONS_DIR")" + else + rsync -av --progress "$ANSIBLE_COLLECTIONS_DIR/" "$BACKUP_BASE_DIR/collections/system/" + fi + fi + + # Collections utilisateur + USER_COLLECTIONS_DIR="$HOME/.ansible/collections" + if [[ -d "$USER_COLLECTIONS_DIR" ]]; then + log "Sauvegarde des collections utilisateur: $USER_COLLECTIONS_DIR" + if [[ "$COMPRESS_COLLECTIONS" == "true" ]]; then + tar -czf "$BACKUP_BASE_DIR/collections/user_collections.tar.gz" \ + -C "$HOME/.ansible" "collections" + else + rsync -av --progress "$USER_COLLECTIONS_DIR/" "$BACKUP_BASE_DIR/collections/user/" + fi + fi + + # Liste des collections installées + if check_command ansible-galaxy; then + log "Création de la liste des collections installées..." + ansible-galaxy collection list > "$BACKUP_BASE_DIR/metadata/installed_collections.txt" 2>/dev/null || true + fi + else + log "Sauvegarde des collections désactivée" + fi +} + +backup_configuration() { + log "Sauvegarde de la configuration Ansible..." + + # Fichier de configuration principal + if [[ -f "$ANSIBLE_CONFIG_FILE" ]]; then + log "Sauvegarde du fichier de configuration: $ANSIBLE_CONFIG_FILE" + cp "$ANSIBLE_CONFIG_FILE" "$BACKUP_BASE_DIR/config/ansible.cfg" + fi + + # Configuration active (dump) + if [[ -f /tmp/ansible_active_config.txt ]]; then + cp /tmp/ansible_active_config.txt "$BACKUP_BASE_DIR/config/active_config.txt" + rm -f /tmp/ansible_active_config.txt + fi + + # Variables d'environnement Ansible + env | grep -E '^ANSIBLE_' > "$BACKUP_BASE_DIR/config/ansible_env_vars.txt" || true + + # Configuration SSH si utilisée par Ansible + if [[ -f "$HOME/.ssh/config" ]]; then + log "Sauvegarde de la configuration SSH..." + cp "$HOME/.ssh/config" "$BACKUP_BASE_DIR/config/ssh_config" + fi + + # Clés SSH utilisées par Ansible (sans les clés privées) + if [[ -d "$HOME/.ssh" ]]; then + find "$HOME/.ssh" -name "*.pub" -exec cp {} "$BACKUP_BASE_DIR/config/" \; 2>/dev/null || true + fi +} + +backup_vault() { + log "Sauvegarde des fichiers vault Ansible..." + + if [[ "$BACKUP_VAULT" == "true" && -d "$ANSIBLE_VAULT_DIR" ]]; then + log "Sauvegarde du répertoire vault: $ANSIBLE_VAULT_DIR" + rsync -av --progress "$ANSIBLE_VAULT_DIR/" "$BACKUP_BASE_DIR/vault/" + fi + + # Recherche de fichiers vault dans les playbooks et rôles + if [[ "$BACKUP_VAULT" == "true" ]]; then + log "Recherche de fichiers vault dans l'arborescence..." + + # Construction de la liste des répertoires à rechercher + SEARCH_DIRS="" + [[ -d "$ANSIBLE_PLAYBOOKS_DIR" ]] && SEARCH_DIRS="$SEARCH_DIRS $ANSIBLE_PLAYBOOKS_DIR" + [[ -d "$ANSIBLE_ROLES_DIR" ]] && SEARCH_DIRS="$SEARCH_DIRS $ANSIBLE_ROLES_DIR" + + if [[ -n "$SEARCH_DIRS" ]]; then + find $SEARCH_DIRS -name "*vault*" -type f 2>/dev/null | \ + while read -r vault_file; do + if [[ -f "$vault_file" ]]; then + # Déterminer le chemin relatif correct + rel_path="" + if [[ "$vault_file" == "$ANSIBLE_PLAYBOOKS_DIR"* ]]; then + rel_path="playbooks/$(echo "$vault_file" | sed "s|$ANSIBLE_PLAYBOOKS_DIR/||")" + elif [[ "$vault_file" == "$ANSIBLE_ROLES_DIR"* ]]; then + rel_path="roles/$(echo "$vault_file" | sed "s|$ANSIBLE_ROLES_DIR/||")" + else + rel_path="other/$(basename "$vault_file")" + fi + + mkdir -p "$BACKUP_BASE_DIR/vault/discovered/$(dirname "$rel_path")" + cp "$vault_file" "$BACKUP_BASE_DIR/vault/discovered/$rel_path" 2>/dev/null || true + fi + done + else + log "Aucun répertoire de playbooks ou rôles trouvé pour la recherche de vault" + fi + fi +} + +backup_logs() { + log "Sauvegarde des logs Ansible..." + + if [[ "$BACKUP_LOGS" == "true" && -d "$ANSIBLE_LOG_DIR" ]]; then + log "Sauvegarde du répertoire de logs: $ANSIBLE_LOG_DIR" + rsync -av --progress "$ANSIBLE_LOG_DIR/" "$BACKUP_BASE_DIR/logs/" \ + --exclude="*.tmp" --include="*.log" --include="*.log.*" + fi + + # Logs système d'Ansible + if [[ -f "/var/log/ansible.log" ]]; then + cp "/var/log/ansible.log" "$BACKUP_BASE_DIR/logs/system_ansible.log" + fi + + # Journaux systemd si disponibles + if check_command journalctl; then + log "Export des journaux systemd pour Ansible..." + journalctl -u ansible* --no-pager > "$BACKUP_BASE_DIR/logs/systemd_ansible.log" 2>/dev/null || true + fi +} + +create_metadata() { + log "Création des métadonnées de sauvegarde..." + + # Informations système + cat > "$BACKUP_BASE_DIR/metadata/system_info.txt" << EOF +Sauvegarde Ansible +================== +Date: $(date) +Serveur: $(hostname) +Version script: 1.0 +Utilisateur: $(whoami) +Type d'installation Ansible: $ANSIBLE_INSTALL_TYPE +Répertoires sauvegardés: +- Configuration: $ANSIBLE_CONFIG_FILE +- Playbooks: $ANSIBLE_PLAYBOOKS_DIR +- Rôles: $ANSIBLE_ROLES_DIR +- Inventaires: $ANSIBLE_INVENTORY_DIR +- Collections: $ANSIBLE_COLLECTIONS_DIR +- Logs: $ANSIBLE_LOG_DIR +Options de sauvegarde: +- Playbooks: $BACKUP_PLAYBOOKS +- Rôles: $BACKUP_ROLES +- Inventaires: $BACKUP_INVENTORIES +- Collections: $BACKUP_COLLECTIONS +- Vault: $BACKUP_VAULT +- Logs: $BACKUP_LOGS +- Compression collections: $COMPRESS_COLLECTIONS +EOF + + # Version d'Ansible + if check_command ansible; then + echo "" >> "$BACKUP_BASE_DIR/metadata/system_info.txt" + echo "Informations Ansible:" >> "$BACKUP_BASE_DIR/metadata/system_info.txt" + ansible --version >> "$BACKUP_BASE_DIR/metadata/system_info.txt" 2>/dev/null || true + fi + + # Liste des modules disponibles + if check_command ansible-doc; then + log "Création de la liste des modules disponibles..." + ansible-doc -l > "$BACKUP_BASE_DIR/metadata/available_modules.txt" 2>/dev/null || true + fi + + # Taille de la sauvegarde + BACKUP_SIZE=$(du -sh "$BACKUP_BASE_DIR" | cut -f1) + echo "Taille totale de la sauvegarde: $BACKUP_SIZE" >> "$BACKUP_BASE_DIR/metadata/system_info.txt" + + log "Sauvegarde locale créée dans: $BACKUP_BASE_DIR (Taille: $BACKUP_SIZE)" +} + +sync_to_remote() { + log "Synchronisation vers le serveur distant..." + + # Création du répertoire distant si nécessaire + ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" \ + "mkdir -p ${SAMBA_SHARE}/${REMOTE_BACKUP_DIR}/$(date +%Y/%m)" + + # Synchronisation des fichiers + REMOTE_PATH="${SAMBA_USER}@${SAMBA_SERVER}:${SAMBA_SHARE}/${REMOTE_BACKUP_DIR}/$(date +%Y/%m)/ansible_backup_$(date +%Y%m%d_%H%M%S)/" + + log "Envoi vers: $REMOTE_PATH" + rsync -avz --progress --delete \ + -e "ssh -i $SSH_KEY_PATH $SSH_OPTIONS" \ + "$BACKUP_BASE_DIR/" \ + "$REMOTE_PATH" + + log "Synchronisation terminée" +} + +cleanup_local() { + log "Nettoyage des fichiers temporaires..." + if [[ -d "$BACKUP_BASE_DIR" ]]; then + rm -rf "$BACKUP_BASE_DIR" + log "Répertoire temporaire supprimé: $BACKUP_BASE_DIR" + fi +} + +cleanup_remote() { + log "Nettoyage des anciennes sauvegardes (plus de $RETENTION_DAYS jours)..." + + ssh -i "$SSH_KEY_PATH" $SSH_OPTIONS "${SAMBA_USER}@${SAMBA_SERVER}" \ + "find ${SAMBA_SHARE}/${REMOTE_BACKUP_DIR} -type d -name 'ansible_backup_*' -mtime +${RETENTION_DAYS} -exec rm -rf {} + 2>/dev/null || true" + + log "Nettoyage des anciennes sauvegardes terminé" +} + +# ============================================================================= +# FONCTION PRINCIPALE +# ============================================================================= + +main() { + log "=== DÉBUT DE LA SAUVEGARDE ANSIBLE ===" + + # Vérifications préliminaires + check_root + + # Installation des dépendances + install_dependencies + + # Configuration SSH + setup_ssh_key + test_ssh_connection + + # Détection de l'environnement + detect_environment + + # Gestion des erreurs avec nettoyage + trap 'cleanup_local' EXIT ERR + + # Création de la structure de sauvegarde + create_backup_structure + + # Sauvegarde des playbooks + backup_playbooks + + # Sauvegarde des rôles + backup_roles + + # Sauvegarde des inventaires + backup_inventories + + # Sauvegarde des collections + backup_collections + + # Sauvegarde de la configuration + backup_configuration + + # Sauvegarde des fichiers vault + backup_vault + + # Sauvegarde des logs + backup_logs + + # Création des métadonnées + create_metadata + + # Synchronisation vers le serveur distant + sync_to_remote + + # Nettoyage + cleanup_remote + cleanup_local + + log "=== SAUVEGARDE ANSIBLE TERMINÉE AVEC SUCCÈS ===" +} + +# ============================================================================= +# POINT D'ENTRÉE +# ============================================================================= + +# Vérification des arguments pour les options avancées +while [[ $# -gt 0 ]]; do + case $1 in + --no-playbooks) + BACKUP_PLAYBOOKS=false + log "Option: Sauvegarde des playbooks désactivée" + shift + ;; + --no-roles) + BACKUP_ROLES=false + log "Option: Sauvegarde des rôles désactivée" + shift + ;; + --no-collections) + BACKUP_COLLECTIONS=false + log "Option: Sauvegarde des collections désactivée" + shift + ;; + --no-vault) + BACKUP_VAULT=false + log "Option: Sauvegarde des fichiers vault désactivée" + shift + ;; + --no-logs) + BACKUP_LOGS=false + log "Option: Sauvegarde des logs désactivée" + shift + ;; + --no-compression) + COMPRESS_COLLECTIONS=false + log "Option: Compression des collections désactivée" + shift + ;; + --help) + echo "Usage: $0 [OPTIONS]" + echo "Options:" + echo " --no-playbooks Ne pas sauvegarder les playbooks Ansible" + echo " --no-roles Ne pas sauvegarder les rôles Ansible" + echo " --no-collections Ne pas sauvegarder les collections" + echo " --no-vault Ne pas sauvegarder les fichiers vault" + echo " --no-logs Ne pas sauvegarder les logs" + echo " --no-compression Ne pas compresser les collections" + echo " --help Afficher cette aide" + exit 0 + ;; + *) + error_exit "Option inconnue: $1" + ;; + esac +done + +# Création du fichier de log si nécessaire +mkdir -p "$(dirname "$LOG_FILE")" +touch "$LOG_FILE" + +# Lancement du script principal +main "$@" \ No newline at end of file