--- # Przywrócenie primary z pg2 (replica) # Używany w przypadku awarii pg1 # --- Auto-detect PostgreSQL version na replica --- - name: Detect PostgreSQL version on replica shell: "ls -d /etc/postgresql/*/ | head -1 | xargs basename" register: pg_version_detect changed_when: false delegate_to: pg2 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 replica to be accessible wait_for: host: pg2 port: 5432 timeout: 300 # --- Promowanie replica --- - name: Promote replica to primary shell: "{{ pg_bin_path }}/pg_ctl promote -D {{ pg_data }}" become: true become_user: postgres delegate_to: pg2 register: promote_result - name: Wait for promoted replica to be ready wait_for: host: pg2 port: 5432 timeout: 60 # --- Przywrócenie na pg1 --- - name: Stop PostgreSQL on primary (pg1) systemd: name: postgresql state: stopped ignore_errors: true - name: Remove old cluster data on primary file: path: "{{ pg_data }}" state: absent become: true # --- Base backup z nowego primary (pg2) --- - name: Perform base backup from new primary (pg2) shell: | pg_basebackup \ -h pg2 \ -D {{ pg_data }} \ -U replicator \ -Fp \ -Xs \ -P \ -R become: true become_user: postgres register: restore_basebackup - name: Fix permissions on restored data directory file: path: "{{ pg_data }}" owner: postgres group: postgres mode: "0700" recurse: yes become: true - name: Configure recovery settings lineinfile: path: "{{ pg_data }}/standby.signal" line: "" create: yes owner: postgres group: postgres mode: "0644" # --- Uruchomienie pg1 --- - name: Start PostgreSQL on primary systemd: name: postgresql state: started enabled: yes - name: Wait for PostgreSQL to start wait_for: path: "/var/run/postgresql/.s.PGSQL.5432" timeout: 60 # --- Weryfikacja --- - name: Verify primary is accessible postgresql_query: db: postgres query: "SELECT version()" login_unix_socket_directory: /var/run/postgresql become: true become_user: postgres register: version_check - name: Display restoration result debug: msg: "Primary restored successfully. PostgreSQL: {{ version_check.query_result[0].version }}" - name: Display manual failover instructions debug: msg: | Restoration complete! Next steps: 1. Verify pg1 and pg2 connectivity 2. Update application connection strings if needed 3. Monitor replication status: SELECT * FROM pg_stat_replication; 4. Schedule regular test restores