--- # ============================================ # PostgreSQL Installation (vm-postgres uniquement) # ============================================ - name: Installation et configuration de PostgreSQL hosts: uber-stup become: true gather_facts: true tasks: # ============================================================ # Dépendances requises # ============================================================ - name: Installer les dépendances pour le dépôt APT ansible.builtin.apt: name: - gnupg2 - curl - ca-certificates - lsb-release - python3-psycopg2 - acl state: present update_cache: yes # ============================================================ # Ajout du dépôt officiel PostgreSQL # ============================================================ - name: Ajouter la clé GPG du dépôt PostgreSQL ansible.builtin.apt_key: url: https://www.postgresql.org/media/keys/ACCC4CF8.asc state: present - name: Ajouter le dépôt PostgreSQL 16 ansible.builtin.apt_repository: repo: "deb http://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main" state: present filename: pgdg # ============================================================ # Installation PostgreSQL 16 # ============================================================ - name: Installer PostgreSQL 16 ansible.builtin.apt: name: - "postgresql-{{ pg_version }}" - "postgresql-client-{{ pg_version }}" - "postgresql-contrib-{{ pg_version }}" state: present update_cache: yes - name: Démarrer et activer PostgreSQL ansible.builtin.systemd: name: postgresql state: started enabled: yes # ============================================================ # Configuration PostgreSQL # ============================================================ - name: Configurer l'écoute sur localhost ansible.builtin.lineinfile: path: "/etc/postgresql/{{ pg_version }}/main/postgresql.conf" regexp: "^#?listen_addresses" line: "listen_addresses = 'localhost'" notify: Restart postgresql - name: Configurer le port ansible.builtin.lineinfile: path: "/etc/postgresql/{{ pg_version }}/main/postgresql.conf" regexp: "^#?port" line: "port = {{ db_port }}" notify: Restart postgresql # ============================================================ # Locale requise # ============================================================ - name: Générer la locale fr_FR.UTF-8 ansible.builtin.command: locale-gen fr_FR.UTF-8 register: locale_gen changed_when: "'Generation complete' in locale_gen.stdout" - name: Mettre à jour les locales ansible.builtin.command: update-locale when: locale_gen.changed # ============================================================ # Création de la base de données et configuration utilisateur # ============================================================ - name: Définir le mot de passe de l'utilisateur postgres become_user: postgres ansible.builtin.postgresql_user: name: "{{ db_user }}" password: "{{ db_password }}" state: present - name: Vérifier si la base de données existe become_user: postgres ansible.builtin.command: psql -tAc "SELECT 1 FROM pg_database WHERE datname='{{ db_name }}'" register: db_exists changed_when: false - name: Créer la base de données avec ICU become_user: postgres ansible.builtin.command: > psql -c "CREATE DATABASE {{ db_name }} OWNER {{ db_user }} ENCODING 'UTF8' LOCALE_PROVIDER icu ICU_LOCALE 'fr-FR' TEMPLATE template0" when: db_exists.stdout != "1" - name: Accorder tous les privilèges sur la base become_user: postgres ansible.builtin.postgresql_privs: db: "{{ db_name }}" role: "{{ db_user }}" type: database privs: ALL state: present # ============================================================ # Données initiales - corrections d'adresses # ============================================================ - name: Insérer les corrections d'adresses become_user: postgres ansible.builtin.postgresql_query: db: "{{ db_name }}" query: | INSERT INTO adresse_correction (invalid_address, correct_address) VALUES ('6 Place Alfred Lallié 44000 Nantes', '13 Rue Saint-Rogatien 44000 Nantes'), ('26 boulevard Vincent gâche 44200', '62 Rue des Français Libres 44200'), ('41 quai Malakoff 44000', '41 rue du pré Gauchet 44000'), ('au 6 rue du Rhône 44100', '106 rue du bois Hardy 44100'), ('10 allée de l''île gloriette 44000', '8 rue Deurbroucq 44000'), ('1 Ter Boulevard de Launay 44100', '5 Rue Lavoisier 44100'), ('6 Boulevard de la prairie au duc 44200', '10 Rue Alain Barbe Torte 44200'), ('4 rue de mauves , 44470 thouaré sur Loire', '4 Rue de la Halbarderie 44470 Thouaré-sur-Loire'), ('26 rue Louis blanc, 44200 Nantes', '6 Rue de Hercé 44200 Nantes'), ('4 rue la tour d''Auvergne 44200 nantes', '6 Rue de Hercé 44200 Nantes'), ('12 rue d''Orléans 44000', '10 rue de l''industrie 44000'), ('3 rue Bertrand Geslin 44000 Nantes', '10 Rue de Sévigné 44000 Nantes'), ('33 boulevard de doulon 44300', '3 Avenue du Forgeron 44300 Nantes'), ('2 rue Stanislas Baudry 44000 Nantes', '9 Rue de Richebourg 44000 Nantes'), ('8 Place Saint-Pierre, 44000 Nantes', '2 Rue Saint-Denis 44000 Nantes'), ('20 boulevard du petit port 44300', '3 Rue du Transvaal 44300 Nantes'), ('5 cours Sully 44000 Nantes', '75 Rue Préfet Bonnefoy 44000'), ('50 rue Paul Bellamy 44000', '2 rue du docteur Heurteaux 44000'), ('33 rue de la petite sensive 44300', '8 Rue du Docteur Chenantais 44300'), ('45 rue Louis guiotton 44300 Nantes', '59 Rue de Nancy 44300 Nantes'), ('6 rue Meuris 44000 Nantes', '3 Rue Daubenton 44100 Nantes'), ('26 rue Félix Faure 44000', '12 rue bonaparte 44000'), ('1 rue Charles Dullin 44100 nantes', '12 Avenue de l''Églantine 44800 Saint-Herblain'), ('16 rue Anatole de monzie 44200', '1 Rue Georges Leygues 44200 Nantes'), ('52 boulevard de l''Estuaire 44200', '1 Rue Ruth First 44200 Nantes'), ('186 Route de Saint-Joseph 44300 Nantes', 'Rue de Pontecorvo 44300 Nantes'), ('16 Rue Jules Launey 44100 Nantes', '5 Chemin du Pressoir Chênaie 44100 Nantes'), ('1 rue maréchal Lyautey 44000', '9 rue Louis Mékarski 44000'), ('74 boulevard de la prairie au duc 44200', '7 Rue René Siegfried 44200'), ('1 impasse du baut 44300 Nantes', '8 Avenue d''Assise 44300 Nantes'), ('5 rue moquechien, 44000 Nantes', '4 Rue Adolphe Moitié 44000 Nantes'), ('21 chaussée de la madeleine 44000', '4 bis Rue Perrault 44000 Nantes'), ('31 boulevard Michelet 44000', '26 Rue de la Haute Forêt 44000 Nantes'), ('95 Boulevard longchamp 44300', '7 Petite Avenue de Longchamp 44300'), ('7 Quai Marcel Boissard, 44400 Rezé', '6 Rue Jean Jouneau 44400 Rezé'), ('43 avenue de la libération 44400', '10 rue de l''Erdronnière 44400'), ('165 route de rennes 44700 orvault', '5 Rue de l''Ascension 44700 Orvault'), ('17rue yves bodiguel 44000', '8 Rue Frédureau 44000 Nantes'), ('176 boulevard Jules verne 44300', '44 Rue des Platanes 44300 Nantes'), ('133 Boulevard Jules Verne 44300', '28 Rue Moriceau Thébault 44300'), ('53 Boulevard Jules Verne 44300', '66 Rue de la Moisdonnière 44300'), ('7 chaussé de la madeleine, 44000', '3 Rue Perrault 44000 Nantes'), ('LA CHEVROLIÈRE', '12 Rue des Ajoncs 44400 Rezé'), ('9 rue Delattre de tassigny 44000 nantes', '1 Rue des Cadeniers 44000 Nantes'), ('14 place de l''Oratoire 44000 Nantes', '2 Rue Élie Delaunay 44000 Nantes'), ('19 allée Baco, 44000 Nantes', '23 Rue Crucy 44000 Nantes'), ('21bd babin chevaye 44200', '7 Rue de Hercé 44200 Nantes'), ('49 boulevard dalby 44000', '51 Rue de la Ville en Pierre 44000'), ('96 route de Vannes 44100', '14 Avenue des Coucous 44300'), ('1 rue du Luxembourg 44000 Nantes', '5 Rue de l''Indre 44000 Nantes'), ('3 rue de bretagne 44880 Sautron', '9 Rue de Flore 44880 Sautron'), ('42 rue paul bellamy 44000 nantes', '5 Rue de Bouillé 44000 Nantes'), ('125 Rue Paul Bellamy 44000 Nantes', '14 Rue Anatole le Braz 44000 Nantes'), ('214 Rue Paul Bellamy 44000 Nantes', '17 Rue de la Saulzinière 44000 Nantes'), ('49 Boulevard Robert Schuman 44300 Nantes', '47 Rue Georges Bizot 44300 Nantes'), ('142 Boulevard Robert Schuman 44300', '10 Rue St-Mihiel 44300 Nantes'), ('23 route de la chapelle sur erdre 44300', '14 Rue de la Boulonnerie 44300 Nantes'), ('27 Rue Pierre Blard 44800 Saint-Herblain', '2 Rue Louis Boutin 44800 Saint-Herblain'), ('109 Boulevard Ernest Dalby 44000 Nantes', '53 bis rue de la ville en pierre 44000'), ('13 rue pitre chevalier 44000', '10 Rue Jean-Émile Laboureur 44000'), ('Rue lesage - 44000 - Nantes', '4 rue Maurice Sibille 44000'), ('86 Rue de la Bourgeonnière 44300', '6 Avenue de l''Alverne 44300'), ('8 boulevard Émile romanet 44100', '33 Route de St-Herblain 44100 Nantes') ON CONFLICT (invalid_address) DO NOTHING; # ============================================================ # Authentification pg_hba.conf # ============================================================ - name: Configurer l'authentification md5 pour les connexions locales ansible.builtin.postgresql_pg_hba: dest: "/etc/postgresql/{{ pg_version }}/main/pg_hba.conf" contype: host databases: "{{ db_name }}" users: "{{ db_user }}" source: "127.0.0.1/32" method: md5 notify: Restart postgresql - name: Configurer l'authentification md5 pour IPv6 local ansible.builtin.postgresql_pg_hba: dest: "/etc/postgresql/{{ pg_version }}/main/pg_hba.conf" contype: host databases: "{{ db_name }}" users: "{{ db_user }}" source: "::1/128" method: md5 notify: Restart postgresql # ============================================================ # Vérification # ============================================================ - name: Vérifier la version de PostgreSQL become_user: postgres ansible.builtin.command: psql --version register: pg_version_check changed_when: false - name: Afficher la version ansible.builtin.debug: msg: "{{ pg_version_check.stdout }}" - name: Vérifier que la base existe become_user: postgres ansible.builtin.command: psql -lqt register: pg_databases changed_when: false - name: Afficher les bases de données ansible.builtin.debug: msg: "{{ pg_databases.stdout_lines }}" handlers: - name: Restart postgresql ansible.builtin.systemd: name: postgresql state: restarted # ============================================ # Redis Installation (vm-redis uniquement) # ============================================ - name: Installation et configuration de Redis hosts: uber-stup become: true gather_facts: true tasks: - name: Installer Redis apt: name: - redis-server - python3-redis state: present update_cache: yes - name: Créer le répertoire de backup Redis file: path: /var/lib/redis/backup state: directory owner: redis group: redis mode: "0755" - name: Configurer Redis - bind address (accepter connexions réseau) lineinfile: path: /etc/redis/redis.conf regexp: "^bind" line: "bind 127.0.0.1 192.168.1.62" state: present notify: Redémarrer Redis - name: Configurer Redis - port lineinfile: path: /etc/redis/redis.conf regexp: "^port" line: "port {{ redis_port }}" state: present notify: Redémarrer Redis - name: Configurer Redis - maxmemory lineinfile: path: /etc/redis/redis.conf regexp: "^# ?maxmemory" line: "maxmemory {{ redis_maxmemory }}" state: present notify: Redémarrer Redis - name: Configurer Redis - maxmemory-policy lineinfile: path: /etc/redis/redis.conf regexp: "^# ?maxmemory-policy" line: "maxmemory-policy {{ redis_maxmemory_policy }}" state: present notify: Redémarrer Redis - name: Configurer Redis - requirepass lineinfile: path: /etc/redis/redis.conf regexp: "^# ?requirepass" line: "requirepass {{ redis_password }}" state: present notify: Redémarrer Redis - name: Activer AOF (Append Only File) pour Redis lineinfile: path: /etc/redis/redis.conf regexp: "^appendonly" line: "appendonly yes" state: present notify: Redémarrer Redis - name: Configurer la fréquence de sync AOF lineinfile: path: /etc/redis/redis.conf regexp: "^# ?appendfsync" line: "appendfsync everysec" state: present notify: Redémarrer Redis - name: Activer la persistance RDB (snapshots) blockinfile: path: /etc/redis/redis.conf block: | save 900 1 save 300 10 save 60 10000 marker: "# {mark} ANSIBLE MANAGED RDB PERSISTENCE" notify: Redémarrer Redis - name: Configurer le nom du fichier AOF lineinfile: path: /etc/redis/redis.conf regexp: "^appendfilename" line: 'appendfilename "appendonly.aof"' state: present notify: Redémarrer Redis - name: Désactiver le mode protégé Redis lineinfile: path: /etc/redis/redis.conf regexp: "^protected-mode" line: "protected-mode no" state: present notify: Redémarrer Redis - name: Configurer le répertoire de travail Redis lineinfile: path: /etc/redis/redis.conf regexp: "^dir" line: "dir /var/lib/redis" state: present notify: Redémarrer Redis - name: Définir le niveau de log lineinfile: path: /etc/redis/redis.conf regexp: "^loglevel" line: "loglevel notice" state: present notify: Redémarrer Redis - name: S'assurer que Redis est démarré systemd: name: redis-server state: started enabled: yes handlers: - name: Redémarrer Redis systemd: name: redis-server state: restarted