infra/home/ansible/postgresql-upgrade-15-to-17.yml
2025-09-08 10:13:45 -05:00

173 lines
No EOL
5.4 KiB
YAML

---
- name: Upgrade PostgreSQL from 15 to 17
hosts: postgresql
become: yes
gather_facts: yes
vars:
old_version: 15
new_version: 17
postgres_data_dir: "/var/lib/postgresql"
backup_dir: "/var/backups/postgresql-upgrade-{{ ansible_date_time.epoch }}"
tasks:
- name: Check current PostgreSQL version
command: sudo -u postgres psql -t -c "SELECT version();"
register: pg_version_check
changed_when: false
- name: Display current PostgreSQL version
debug:
msg: "Current PostgreSQL version: {{ pg_version_check.stdout }}"
- name: Install required packages
apt:
name:
- postgresql-{{ new_version }}
- postgresql-client-{{ new_version }}
- postgresql-contrib-{{ new_version }}
- postgresql-{{ new_version }}-postgis-3 # If PostGIS is needed
state: present
update_cache: yes
- name: Stop PostgreSQL services
service:
name: "{{ item }}"
state: stopped
loop:
- "postgresql@{{ old_version }}-main"
- "postgresql@{{ new_version }}-main"
ignore_errors: yes
- name: Create backup directory
file:
path: "{{ backup_dir }}"
state: directory
owner: postgres
group: postgres
mode: '0755'
- name: Get list of databases
become_user: postgres
postgresql_info:
filter: databases
register: pg_databases
- name: Backup all databases
become_user: postgres
command: |
pg_dumpall -p 5432 > {{ backup_dir }}/all_databases.sql
environment:
PGVERSION: "{{ old_version }}"
- name: Backup PostgreSQL configuration files
copy:
src: "{{ item }}"
dest: "{{ backup_dir }}/"
remote_src: yes
owner: postgres
group: postgres
loop:
- "/etc/postgresql/{{ old_version }}/main/postgresql.conf"
- "/etc/postgresql/{{ old_version }}/main/pg_hba.conf"
ignore_errors: yes
- name: Check if new cluster exists
stat:
path: "/etc/postgresql/{{ new_version }}/main"
register: new_cluster_check
- name: Drop new cluster if it exists
command: pg_dropcluster {{ new_version }} main --stop
when: new_cluster_check.stat.exists
ignore_errors: yes
- name: Upgrade PostgreSQL cluster
command: |
pg_upgradecluster {{ old_version }} main
register: upgrade_result
environment:
LC_ALL: C.UTF-8
LANG: C.UTF-8
- name: Show upgrade result
debug:
var: upgrade_result.stdout_lines
- name: Start new PostgreSQL service
service:
name: "postgresql@{{ new_version }}-main"
state: started
enabled: yes
- name: Verify new PostgreSQL version
command: sudo -u postgres psql -p 5432 -t -c "SELECT version();"
register: new_pg_version
changed_when: false
- name: Display new PostgreSQL version
debug:
msg: "New PostgreSQL version: {{ new_pg_version.stdout }}"
- name: Update PostgreSQL configuration
lineinfile:
path: "/etc/postgresql/{{ new_version }}/main/postgresql.conf"
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: '^#?listen_addresses', line: "listen_addresses = '*'" }
- { regexp: '^#?max_connections', line: "max_connections = 200" }
- { regexp: '^#?shared_buffers', line: "shared_buffers = 2GB" }
- { regexp: '^#?effective_cache_size', line: "effective_cache_size = 6GB" }
- { regexp: '^#?work_mem', line: "work_mem = 16MB" }
notify: restart postgresql
- name: Update pg_hba.conf for network access
blockinfile:
path: "/etc/postgresql/{{ new_version }}/main/pg_hba.conf"
block: |
# Allow connections from K3s cluster
host all all 10.0.19.0/24 scram-sha-256
host all all 10.0.0.0/8 scram-sha-256
marker: "# {mark} ANSIBLE MANAGED BLOCK - K3s access"
notify: restart postgresql
- name: Check if PostGIS extension needs update
become_user: postgres
command: psql -d forgejo -c "SELECT PostGIS_version();"
register: postgis_check
ignore_errors: yes
changed_when: false
- name: Update PostGIS extension if present
become_user: postgres
command: psql -d {{ item }} -c "ALTER EXTENSION postgis UPDATE;"
loop:
- forgejo
- postgres
when: postgis_check.rc == 0
ignore_errors: yes
- name: Run ANALYZE on all databases
become_user: postgres
command: psql -d {{ item }} -c "ANALYZE;"
loop: "{{ pg_databases.databases.keys() | select('ne', 'template0') | list }}"
when: pg_databases.databases is defined
ignore_errors: yes
- name: Display upgrade summary
debug:
msg:
- "PostgreSQL upgrade completed successfully!"
- "Old version: PostgreSQL {{ old_version }}"
- "New version: PostgreSQL {{ new_version }}"
- "Backup location: {{ backup_dir }}"
- ""
- "IMPORTANT: The old cluster is still present but stopped."
- "After verifying everything works correctly, you can remove it with:"
- " sudo pg_dropcluster {{ old_version }} main"
handlers:
- name: restart postgresql
service:
name: "postgresql@{{ new_version }}-main"
state: restarted