173 lines
No EOL
5.4 KiB
YAML
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 |