From 60f8384e15da43e849179be26d480328c48e2a04 Mon Sep 17 00:00:00 2001
From: Thomas Schneider <thomas@fsmpi.rwth-aachen.de>
Date: Sat, 17 Sep 2022 15:01:47 +0200
Subject: [PATCH] postgres: Add Commvault backup compatibility

---
 postgres/defaults/main.yml     |  4 +++
 postgres/handlers/main.yml     |  6 ++++
 postgres/tasks/main.yml        | 66 ++++++++++++++++++++++++++++++++--
 postgres/templates/pg_ident.j2 |  3 ++
 4 files changed, 77 insertions(+), 2 deletions(-)
 create mode 100644 postgres/handlers/main.yml
 create mode 100644 postgres/templates/pg_ident.j2

diff --git a/postgres/defaults/main.yml b/postgres/defaults/main.yml
index 97bb888..5818f96 100644
--- a/postgres/defaults/main.yml
+++ b/postgres/defaults/main.yml
@@ -2,3 +2,7 @@
 
 postgres_pgdg_repo: false
 postgres_rsnapshot: false
+postgres_commvault_compat: false
+
+### Will be the version of the `postgresql` package if undefined
+# postgres_version: 15
diff --git a/postgres/handlers/main.yml b/postgres/handlers/main.yml
new file mode 100644
index 0000000..6b6cbd7
--- /dev/null
+++ b/postgres/handlers/main.yml
@@ -0,0 +1,6 @@
+---
+
+- name: Restart Postgres
+  systemd:
+    name: postgresql.service
+    state: restarted
diff --git a/postgres/tasks/main.yml b/postgres/tasks/main.yml
index 868ea84..6fb1268 100644
--- a/postgres/tasks/main.yml
+++ b/postgres/tasks/main.yml
@@ -17,12 +17,24 @@
 - name: ensure postgres packages are installed
   apt:
     name:
-      # yamllint disable-line rule:line-length
-      - postgresql{{ "-{}".format(postgres_version) if postgres_version is defined }}
+      - postgresql{{
+          "-" + postgres_version|string if postgres_version is defined
+        }}
       - python3-psycopg2
       - libpq-dev
     state: present
 
+- when: not postgres_version is defined
+  block:
+    - name: Check installed software
+      package_facts:
+        manager: auto
+
+    - name: Set postgres_version
+      set_fact:
+        postgres_version: >-
+          {{ ansible_facts.packages.postgresql[0].version.split('+')[0] }}
+
 - name: ensure legacy postgres packages are installed
   apt:
     name:
@@ -41,6 +53,7 @@
   block:
     - name: ensure we have our postgres backup script
       copy:
+        # yamllint disable-line rule:line-length
         src: "pgbackup{{ '-bullseye' if ansible_distribution_major_version|int(default=99) > 10 else '' }}.sh"
         dest: /usr/local/bin/pgbackup.sh
         owner: root
@@ -59,3 +72,52 @@
       file:
         path: /etc/cron.d/postgres-snapshot
         state: absent
+
+- name: Configure Commvault backup compatibility
+  when: postgres_commvault_compat
+  block:
+    - name: Create WAL backup directory
+      file:
+        path: /var/backups/pg_wal
+        state: directory
+        owner: postgres
+        group: postgres
+        mode: '0750'
+
+    - name: Configure Postgres WAL archive
+      postgresql_set:
+        name: "{{ item.name }}"
+        value: "{{ item.value }}"
+      loop:
+        - name: archive_mode
+          value: "on"
+        - name: archive_command
+          value: 'cp %p /var/backups/pg_wal/%f'
+      notify:
+        - Restart Postgres
+
+    - name: Configure Postgres ident mappings
+      blockinfile:
+        path: /etc/postgresql/{{ postgres_version }}/main/pg_ident.conf
+        insertafter: '^# MAPNAME\s+SYSTEM-USERNAME\s+PG-USERNAME$'
+        block: '{{ lookup("template", "pg_ident.j2") }}'
+      vars:
+        postgres_ident_mappings:
+          - mapname: postgres
+            system_username: postgres
+            pg_username: postgres
+          - mapname: postgres
+            system_username: root
+            pg_username: postgres
+      notify:
+        - Restart Postgres
+
+    - name: Configure Postgres to use ident mapping for postgres role
+      postgresql_pg_hba:
+        dest: /etc/postgresql/{{ postgres_version }}/main/pg_hba.conf
+        contype: local
+        users: postgres
+        method: peer
+        options: map=postgres
+      notify:
+        - Restart Postgres
diff --git a/postgres/templates/pg_ident.j2 b/postgres/templates/pg_ident.j2
new file mode 100644
index 0000000..27e841e
--- /dev/null
+++ b/postgres/templates/pg_ident.j2
@@ -0,0 +1,3 @@
+{% for i in postgres_ident_mappings %}
+{{ "{mapname:15} {system_username:23} {pg_username}".format(**i) }}
+{% endfor %}
-- 
GitLab