From 7018c981c942b698ff2f99b502cac661759c0e5a Mon Sep 17 00:00:00 2001 From: Jakub Duchek Date: Thu, 1 Oct 2026 18:55:51 +0200 Subject: [PATCH] fixes #605 - used container PostgreSQL tools Run readiness checks, dumps and restores in the configured PostgreSQL image instead of requiring host client packages. Keep backup tests usable when an existing installation already has those packages installed. Use login_db for postgresql_ext, supported since collection 4.0 and required after its old db alias was removed. Fixes #605 AI assistance: Codex. Project signature: GPT_5.6 Sol. --- src/playbooks/backup/backup.yaml | 8 +++-- src/playbooks/restore/restore.yaml | 7 ++++ src/roles/backup/tasks/database_dumps.yaml | 23 ++++++++----- src/roles/backup/tasks/main.yaml | 10 +++++- .../restore/tasks/restore_databases.yaml | 33 ++++++++++++++----- 5 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/playbooks/backup/backup.yaml b/src/playbooks/backup/backup.yaml index 090ea47aa..9c098ddb0 100644 --- a/src/playbooks/backup/backup.yaml +++ b/src/playbooks/backup/backup.yaml @@ -9,14 +9,16 @@ - "../../vars/defaults.yml" - "../../vars/flavors/{{ flavor }}.yml" - "../../vars/certificates.yml" + - "../../vars/images.yml" - "../../vars/foreman.yml" - "../../vars/database.yml" - "../../vars/base.yaml" pre_tasks: - - name: Ensure PostgreSQL client package is installed - ansible.builtin.package: - name: postgresql + - name: Ensure PostgreSQL client image is available + containers.podman.podman_image: + name: "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" state: present + pull: "{{ not (air_gapped | bool) }}" roles: - role: backup vars: diff --git a/src/playbooks/restore/restore.yaml b/src/playbooks/restore/restore.yaml index f824f9a18..dcf8a71d3 100644 --- a/src/playbooks/restore/restore.yaml +++ b/src/playbooks/restore/restore.yaml @@ -5,8 +5,15 @@ gather_facts: true vars_files: - "../../vars/defaults.yml" + - "../../vars/images.yml" - "../../vars/database.yml" - "../../vars/base.yaml" + pre_tasks: + - name: Ensure PostgreSQL client image is available + containers.podman.podman_image: + name: "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" + state: present + pull: "{{ not (air_gapped | bool) }}" roles: - restore diff --git a/src/roles/backup/tasks/database_dumps.yaml b/src/roles/backup/tasks/database_dumps.yaml index 466a5e595..118f07491 100644 --- a/src/roles/backup/tasks/database_dumps.yaml +++ b/src/roles/backup/tasks/database_dumps.yaml @@ -1,14 +1,21 @@ --- - name: Dump databases ansible.builtin.command: - cmd: > - pg_dump - --host={{ item.host }} - --port={{ item.port }} - --username={{ item.user }} - --format=custom - --file="{{ backup_dir_full }}/{{ item.database }}.dump" - "{{ item.database }}" + argv: + - podman + - run + - --rm + - --network=host + - "--volume={{ backup_dir_full }}:/backup:rw,Z" + - --env=PGPASSWORD + - "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" + - pg_dump + - "--host={{ item.host }}" + - "--port={{ item.port }}" + - "--username={{ item.user }}" + - --format=custom + - "--file=/backup/{{ item.database }}.dump" + - "{{ item.database }}" environment: PGPASSWORD: "{{ item.password }}" loop: "{{ backup_databases_config }}" diff --git a/src/roles/backup/tasks/main.yaml b/src/roles/backup/tasks/main.yaml index cddf1b996..695ff67ee 100644 --- a/src/roles/backup/tasks/main.yaml +++ b/src/roles/backup/tasks/main.yaml @@ -92,7 +92,15 @@ - name: Wait for PostgreSQL readiness ansible.builtin.command: - cmd: pg_isready -h {{ database_management_host }} -p {{ database_port }} + argv: + - podman + - run + - --rm + - --network=host + - "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" + - pg_isready + - "--host={{ database_management_host }}" + - "--port={{ database_port }}" register: backup_pg_ready retries: "{{ backup_postgresql_ready_retries }}" delay: "{{ backup_postgresql_ready_delay }}" diff --git a/src/roles/restore/tasks/restore_databases.yaml b/src/roles/restore/tasks/restore_databases.yaml index eebf1e641..cf5b7cec8 100644 --- a/src/roles/restore/tasks/restore_databases.yaml +++ b/src/roles/restore/tasks/restore_databases.yaml @@ -12,7 +12,15 @@ - name: Wait for PostgreSQL readiness ansible.builtin.command: - cmd: pg_isready --host={{ database_management_host }} --port={{ database_port }} + argv: + - podman + - run + - --rm + - --network=host + - "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" + - pg_isready + - "--host={{ database_management_host }}" + - "--port={{ database_port }}" register: restore_pg_ready retries: "{{ restore_postgresql_ready_retries }}" delay: "{{ restore_postgresql_ready_delay }}" @@ -69,7 +77,7 @@ - name: Enable postgres_fdw extension for IOP databases community.postgresql.postgresql_ext: name: postgres_fdw - db: "{{ item.database }}" + login_db: "{{ item.database }}" login_host: "{{ database_management_host }}" login_port: "{{ database_port }}" login_user: postgres @@ -81,13 +89,20 @@ - name: Restore databases from dump files ansible.builtin.command: - cmd: > - pg_restore - --host={{ database_management_host }} - --port={{ database_port }} - --username=postgres - --dbname={{ item.database }} - "{{ restore_backup_dir }}/{{ item.dump_file }}" + argv: + - podman + - run + - --rm + - --network=host + - "--volume={{ restore_backup_dir }}:/backup:ro,Z" + - --env=PGPASSWORD + - "{{ postgresql_container_image }}:{{ postgresql_container_tag }}" + - pg_restore + - "--host={{ database_management_host }}" + - "--port={{ database_port }}" + - --username=postgres + - "--dbname={{ item.database }}" + - "/backup/{{ item.dump_file }}" environment: PGPASSWORD: "{{ postgresql_admin_password }}" loop: "{{ restore_databases_to_restore }}"