INSIGHT-MVP/repos/INSIGHT-Infra/ansible/roles/postgresql/tasks/main.yml
Thomas Reitz 8e235c584e fix: PostgreSQL data migration, Redis auth, Vault-Loading in Playbooks
- PostgreSQL: initdb durch rsync-Ansatz ersetzt (Ubuntu/Debian kompatibel)
  Data-Dir wird via rsync vom Default-Cluster nach /data/postgresql migriert
- PostgreSQL: de_DE.UTF-8 Locale-Generierung als ersten Task hinzugefügt
- Redis: redis-cli ping mit Passwort-Auth (no_log: true)
- Playbooks: vars_files: ../vault.yml in dbs01/aps01/web01 ergänzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-15 16:34:45 +01:00

150 lines
4.1 KiB
YAML

---
# Role: postgresql
# Installiert und konfiguriert PostgreSQL 16 auf DBS01
# Daten werden vom Default-Cluster nach {{ postgresql_data_dir }} verschoben
- name: "de_DE.UTF-8 Locale generieren"
locale_gen:
name: de_DE.UTF-8
state: present
- name: "rsync installieren (für Datenmigration)"
apt:
name: rsync
state: present
- name: "PostgreSQL GPG Key hinzufügen"
apt_key:
url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
state: present
- name: "PostgreSQL Repository hinzufügen"
apt_repository:
repo: "deb http://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main"
state: present
filename: pgdg
- name: "PostgreSQL {{ postgresql_version }} installieren"
apt:
name:
- "postgresql-{{ postgresql_version }}"
- "postgresql-client-{{ postgresql_version }}"
- "postgresql-contrib-{{ postgresql_version }}"
- python3-psycopg2
state: present
update_cache: true
- name: "Prüfen ob Data-Dir bereits PostgreSQL-Daten enthält"
stat:
path: "{{ postgresql_data_dir }}/PG_VERSION"
register: pg_data_exists
- name: "PostgreSQL Service stoppen (für Datenmigration in /data)"
service:
name: "postgresql@{{ postgresql_version }}-main"
state: stopped
when:
- postgresql_data_dir != '/var/lib/postgresql/' ~ postgresql_version ~ '/main'
- not pg_data_exists.stat.exists
- name: "PostgreSQL Data-Verzeichnis anlegen"
file:
path: "{{ postgresql_data_dir }}"
state: directory
owner: postgres
group: postgres
mode: '0700'
when:
- postgresql_data_dir != '/var/lib/postgresql/' ~ postgresql_version ~ '/main'
- not pg_data_exists.stat.exists
- name: "PostgreSQL Default-Cluster nach {{ postgresql_data_dir }} kopieren"
command: >
rsync -a --delete
/var/lib/postgresql/{{ postgresql_version }}/main/
{{ postgresql_data_dir }}/
when:
- postgresql_data_dir != '/var/lib/postgresql/' ~ postgresql_version ~ '/main'
- not pg_data_exists.stat.exists
- name: "Berechtigungen auf Data-Dir sicherstellen"
file:
path: "{{ postgresql_data_dir }}"
owner: postgres
group: postgres
mode: '0700'
when: postgresql_data_dir != '/var/lib/postgresql/' ~ postgresql_version ~ '/main'
- name: "postgresql.conf konfigurieren (inkl. data_directory)"
template:
src: postgresql.conf.j2
dest: "/etc/postgresql/{{ postgresql_version }}/main/postgresql.conf"
owner: postgres
group: postgres
mode: '0644'
notify: restart postgresql
- name: "pg_hba.conf konfigurieren"
template:
src: pg_hba.conf.j2
dest: "/etc/postgresql/{{ postgresql_version }}/main/pg_hba.conf"
owner: postgres
group: postgres
mode: '0640'
notify: reload postgresql
- name: "PostgreSQL Service aktivieren und starten"
service:
name: "postgresql@{{ postgresql_version }}-main"
state: started
enabled: true
- name: "Warten bis PostgreSQL bereit ist"
wait_for:
host: localhost
port: "{{ postgresql_port | default(5432) }}"
timeout: 30
- name: "PostgreSQL INSIGHT Datenbanken anlegen"
become_user: postgres
postgresql_db:
name: "{{ item }}"
encoding: UTF8
lc_collate: de_DE.UTF-8
lc_ctype: de_DE.UTF-8
template: template0
state: present
loop: "{{ postgresql_databases }}"
when: postgresql_databases is defined
- name: "PostgreSQL INSIGHT User anlegen"
become_user: postgres
postgresql_user:
name: "{{ item.name }}"
password: "{{ item.password }}"
role_attr_flags: "{{ item.role_attr_flags | default('LOGIN') }}"
state: present
loop: "{{ postgresql_users }}"
when: postgresql_users is defined
no_log: true
- name: "PostgreSQL Datenbankberechtigungen setzen"
become_user: postgres
postgresql_privs:
db: "{{ item.db }}"
role: "{{ item.role }}"
privs: "{{ item.privs }}"
type: database
state: present
loop: "{{ postgresql_grants }}"
when: postgresql_grants is defined
- name: "PostgreSQL Version ausgeben"
become_user: postgres
command: psql --version
register: pg_version
changed_when: false
- name: "PostgreSQL bereit"
debug:
msg: "{{ pg_version.stdout }} — Data-Dir: {{ postgresql_data_dir }}"