--- # Playbook pour la suppression de Portainer CE # Ce playbook annule les actions du playbook d'installation - name: "Suppression de Portainer CE" hosts: all become: true vars: # Configuration identique au playbook d'installation portainer_repo_dir: "dev/git/outils/dockers/portainer" portainer_data_dir: "/DOCKER_CONFIG/portainer" # Ports à fermer dans le firewall firewall_ports: - 8000 - 9000 - 9443 tasks: # Arrêter et supprimer le conteneur Portainer - name: "Vérifier si le conteneur Portainer existe" command: "docker ps -a --filter name=portainer --format {% raw %}'{{.Names}}'{% endraw %}" register: portainer_containers changed_when: false ignore_errors: true - name: "Arrêter le conteneur Portainer s'il est en cours d'exécution" command: "docker stop portainer" when: portainer_containers.stdout | length > 0 ignore_errors: true - name: "Supprimer le conteneur Portainer" command: "docker rm portainer" when: portainer_containers.stdout | length > 0 ignore_errors: true - name: "Vérifier si l'image Portainer existe" command: "docker images -q portainer/portainer-ce:latest" register: portainer_images changed_when: false failed_when: false - name: "Supprimer l'image Portainer (optionnel)" command: "docker rmi portainer/portainer-ce:latest" when: portainer_images.stdout | length > 0 ignore_errors: true # Supprimer les règles firewall # Support pour UFW (Ubuntu/Debian) - name: "Détecter si UFW est installé" command: "which ufw" register: ufw_check changed_when: false failed_when: false - name: "Supprimer les règles UFW pour Portainer" ufw: rule: reject port: "{{ item }}" proto: tcp delete: yes loop: "{{ firewall_ports }}" when: ufw_check.rc == 0 ignore_errors: true - name: "Recharger UFW" ufw: state: reloaded when: ufw_check.rc == 0 # Support pour Firewalld (CentOS/RHEL/Fedora) - name: "Détecter si Firewalld est installé" command: "which firewall-cmd" register: firewalld_check changed_when: false failed_when: false - name: "Supprimer les règles Firewalld pour Portainer" firewalld: port: "{{ item }}/tcp" permanent: true state: disabled loop: "{{ firewall_ports }}" when: firewalld_check.rc == 0 ignore_errors: true - name: "Recharger Firewalld" command: "firewall-cmd --reload" when: firewalld_check.rc == 0 ignore_errors: true # Support pour iptables (fallback générique) - name: "Détecter si iptables est disponible" command: "which iptables" register: iptables_check changed_when: false failed_when: false - name: "Vérifier si la règle iptables existe pour Portainer" command: "iptables -C INPUT -p tcp --dport {{ item }} -j DROP" register: iptables_rule_check loop: "{{ firewall_ports }}" when: iptables_check.rc == 0 and ufw_check.rc != 0 and firewalld_check.rc != 0 changed_when: false failed_when: false - name: "Supprimer les règles iptables pour Portainer" command: "iptables -D INPUT -p tcp --dport {{ item.item }} -j DROP" loop: "{{ iptables_rule_check.results | default([]) }}" when: - iptables_check.rc == 0 - ufw_check.rc != 0 - firewalld_check.rc != 0 - item.rc == 0 changed_when: true failed_when: false # Supprimer les répertoires et fichiers - name: "Supprimer le répertoire du dépôt Git Portainer" file: path: "{{ portainer_repo_dir }}" state: absent ignore_errors: true - name: "Supprimer le répertoire de données Portainer" file: path: "{{ portainer_data_dir }}" state: absent ignore_errors: true - name: "Supprimer le répertoire parent s'il est vide" file: path: "{{ portainer_repo_dir | dirname }}" state: absent ignore_errors: true # Vérification finale - name: "Vérifier que Portainer a été complètement supprimé" command: "docker ps -a --filter name=portainer --format {% raw %}'{{.Names}}'{% endraw %}" register: final_check changed_when: false ignore_errors: true - name: "Message de confirmation de suppression" debug: msg: | Portainer CE a été complètement supprimé ! - Conteneur arrêté et supprimé - Règles firewall supprimées (UFW/Firewalld/iptables) - Répertoires de données supprimés - Dépôt Git supprimé {% if final_check.stdout | length == 0 %} [SUCCESS] Suppression réussie : Aucun conteneur Portainer trouvé {% else %} [WARNING] Attention : Certains conteneurs Portainer peuvent encore exister {% endif %}