--- # Konfiguracja replikacji PostgreSQL # Ta rola uruchamia się na replica (pg2) # Tworzy użytkownika replicator i base backup z primary # --- Auto-detect PostgreSQL version na primary --- - name: Detect PostgreSQL version on primary shell: "ls -d /etc/postgresql/*/ | head -1 | xargs basename" register: pg_version_detect changed_when: false delegate_to: pg1 run_once: true - name: Set PostgreSQL variables from detection set_fact: pg_version: "{{ pg_version_detect.stdout | trim }}" pg_cluster: "main" pg_data: "/var/lib/postgresql/{{ pg_version_detect.stdout | trim }}/main" pg_bin_path: "/usr/lib/postgresql/{{ pg_version_detect.stdout | trim }}/bin" - name: Wait for PostgreSQL on primary to be ready wait_for: host: pg1 port: 5432 timeout: 300 delegate_to: pg1 # --- Utworzenie użytkownika replicator na primary --- - name: Create replicator user on primary postgresql_user: name: replicator password: "{{ replicator_password }}" role_attr_flags: REPLICATION,LOGIN login_unix_socket_directory: /var/run/postgresql db: postgres become: true become_user: postgres delegate_to: pg1 # --- Przygotowanie replica --- - name: Stop PostgreSQL on replica systemd: name: postgresql state: stopped - name: Remove existing cluster data on replica file: path: "{{ pg_data }}" state: absent # --- Base backup z primary --- - name: Create replication slot on primary postgresql_query: db: postgres query: "SELECT pg_create_physical_replication_slot('pg2_slot')" login_unix_socket_directory: /var/run/postgresql become: true become_user: postgres delegate_to: pg1 ignore_errors: true - name: Perform base backup from primary to replica shell: | pg_basebackup \ -h pg1 \ -D {{ pg_data }} \ -U replicator \ -Fp \ -Xs \ -P \ -R \ -S pg2_slot become: true become_user: postgres register: basebackup_result - name: Fix permissions on data directory file: path: "{{ pg_data }}" owner: postgres group: postgres mode: "0700" recurse: yes become: true - name: Configure replication settings lineinfile: path: "{{ pg_data }}/standby.signal" line: "" create: yes owner: postgres group: postgres mode: "0644" # --- Uruchomienie replica --- - name: Start PostgreSQL on replica systemd: name: postgresql state: started enabled: yes - name: Wait for PostgreSQL replica to be ready wait_for: path: "/var/run/postgresql/.s.PGSQL.5432" timeout: 60 state: present - name: Verify replication on primary postgresql_query: db: postgres query: "SELECT application_name, client_addr, state FROM pg_stat_replication" login_unix_socket_directory: /var/run/postgresql become: true become_user: postgres delegate_to: pg1 register: replication_status - name: Display replication status debug: msg: "{{ replication_status.query_result }}"