- name: Install PostgreSQL packages apt: name: - postgresql - postgresql-contrib update_cache: yes # --- Detect PostgreSQL version and cluster --- - name: Detect PostgreSQL version shell: "ls -d /etc/postgresql/*/ | head -n1 | xargs basename" register: pg_version_result changed_when: false - name: Detect cluster name shell: "ls -d /var/lib/postgresql/*/main/ 2>/dev/null | head -n1 | xargs -I {} basename $(dirname {}) | tail -n1" register: pg_cluster_result changed_when: false - name: Set PostgreSQL version and cluster facts set_fact: pg_version: "{{ pg_version_result.stdout | trim }}" pg_cluster: "main" - name: Define PostgreSQL cluster path set_fact: pg_cluster_path: "/etc/postgresql/{{ pg_version }}/{{ pg_cluster }}" pg_data_path: "/var/lib/postgresql/{{ pg_version }}/{{ pg_cluster }}" # --- Stop cluster before config --- - name: Stop PostgreSQL cluster shell: "pg_ctlcluster {{ pg_version }} {{ pg_cluster }} stop" ignore_errors: true # --- Remove broken cluster configuration if exists --- - name: Remove broken cluster configuration shell: "rm -rf {{ pg_cluster_path }} {{ pg_data_path }}" ignore_errors: true # --- Ensure data directory exists and is owned by postgres --- - name: Create PostgreSQL data directory file: path: "{{ pg_data_path }}" state: directory owner: postgres group: postgres mode: "0700" # --- Initialize database cluster --- - name: Initialize PostgreSQL cluster shell: "sudo -u postgres /usr/lib/postgresql/{{ pg_version }}/bin/initdb -D {{ pg_data_path }} --encoding=UTF8 --locale=en_US.UTF-8" ignore_errors: true # --- Ensure cluster config directory exists --- - name: Ensure cluster config directory exists file: path: "{{ pg_cluster_path }}" state: directory owner: postgres group: postgres mode: "0700" # --- Configure PostgreSQL --- - name: postgresql.conf template: src: postgresql.conf.j2 dest: "{{ pg_cluster_path }}/postgresql.conf" owner: postgres group: postgres mode: "0600" - name: pg_hba.conf template: src: pg_hba.conf.j2 dest: "{{ pg_cluster_path }}/pg_hba.conf" owner: postgres group: postgres mode: "0600" # --- Start cluster --- - name: Start PostgreSQL cluster shell: "sudo -u postgres /usr/lib/postgresql/{{ pg_version }}/bin/pg_ctl -D {{ pg_data_path }} -l /var/log/postgresql/postgresql-{{ pg_version }}-{{ pg_cluster }}.log start" ignore_errors: true # --- Wait for socket to be ready --- - name: Wait for PostgreSQL socket wait_for: path: "/var/run/postgresql/{{ pg_version }}-{{ pg_cluster }}/.s.PGSQL.5432" timeout: 60 # --- Install Python PostgreSQL libraries --- - name: Install python postgres libraries apt: name: - python3-psycopg2 state: present update_cache: yes