Files
PostgreSQL-Ansible/roles/restore_primary/tasks/main.yml
2026-01-29 14:27:03 +01:00

123 lines
2.9 KiB
YAML

---
# 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