Ajouter backups_ansible.sh
This commit is contained in:
665
backups_ansible.sh
Normal file
665
backups_ansible.sh
Normal file
@@ -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 "$@"
|
||||
Reference in New Issue
Block a user