# Alliance Boréale - Rôle PostgreSQL # Couche: C3 (dépendance pour PowerDNS) # Objectif: Déployer PostgreSQL pour backend PowerDNS # Date: 2025-10-31 --- - name: "📦 Install PostgreSQL and dependencies" ansible.builtin.apt: name: - postgresql-{{ postgresql.version }} - postgresql-contrib-{{ postgresql.version }} - python3-psycopg2 state: present update_cache: true tags: postgresql - name: "⚙️ Configure PostgreSQL" ansible.builtin.template: src: postgresql.conf.j2 dest: "/etc/postgresql/{{ postgresql.version }}/main/postgresql.conf" owner: postgres group: postgres mode: '0644' notify: restart postgresql tags: postgresql - name: "⚙️ Configure pg_hba.conf" ansible.builtin.template: src: pg_hba.conf.j2 dest: "/etc/postgresql/{{ postgresql.version }}/main/pg_hba.conf" owner: postgres group: postgres mode: '0640' notify: restart postgresql tags: postgresql - name: "✅ Ensure PostgreSQL is started" ansible.builtin.systemd: name: postgresql state: started enabled: true tags: postgresql - name: "🗄️ Create PostgreSQL databases" community.postgresql.postgresql_db: name: "{{ item.name }}" encoding: "{{ item.encoding | default('UTF8') }}" lc_collate: "{{ item.lc_collate | default('en_US.UTF-8') }}" lc_ctype: "{{ item.lc_ctype | default('en_US.UTF-8') }}" state: present loop: "{{ postgresql.databases }}" become: true become_user: postgres tags: postgresql - name: "👤 Create PostgreSQL users" community.postgresql.postgresql_user: name: "{{ item.name }}" password: "{{ item.password }}" state: present loop: "{{ postgresql.users }}" become: true become_user: postgres no_log: true tags: postgresql - name: "🔐 Grant database privileges" community.postgresql.postgresql_privs: database: "{{ item.name }}" roles: "{{ item.owner }}" type: database privs: ALL state: present loop: "{{ postgresql.databases }}" become: true become_user: postgres tags: postgresql - name: "📊 Create backup directory" ansible.builtin.file: path: "{{ postgresql.backup.destination }}" state: directory owner: postgres group: postgres mode: '0750' when: postgresql.backup.enabled | default(true) tags: postgresql - name: "📊 Configure backup cron job" ansible.builtin.cron: name: "PostgreSQL backup" user: postgres minute: "0" hour: "2" job: "pg_dumpall | gzip > {{ postgresql.backup.destination }}/postgres-$(date +\\%Y\\%m\\%d).sql.gz" state: present when: postgresql.backup.enabled | default(true) tags: postgresql - name: "🗑️ Configure backup retention (delete old backups)" ansible.builtin.cron: name: "PostgreSQL backup cleanup" user: postgres minute: "30" hour: "2" job: "find {{ postgresql.backup.destination }} -name 'postgres-*.sql.gz' -mtime +{{ postgresql.backup.retention_days }} -delete" state: present when: postgresql.backup.enabled | default(true) tags: postgresql - name: "✅ PostgreSQL role completed" ansible.builtin.debug: msg: "✅ PostgreSQL {{ postgresql.version }} configured on {{ inventory_hostname }}" tags: postgresql