--- - name: Initialize connected services list ansible.builtin.set_fact: connected_services: [] - name: Set connected services list ansible.builtin.set_fact: connected_services: >- {{ services | dict2items | selectattr('value.dependency.db', 'defined') | selectattr('value.dependency.db', 'equalto', 'postgresql') | map(attribute='key') | list }} - name: Create postgresql directory ansible.builtin.file: path: "{{ node['home_path'] }}/{{ item }}" state: "directory" owner: "{{ services['postgresql']['subuid'] }}" group: "{{ node['group'] }}" mode: "0770" loop: - "data/containers/postgresql/" - "data/containers/postgresql/backups" - "data/containers/postgresql/backups/sql" - "containers/postgresql" - "containers/postgresql/data" - "containers/postgresql/config" - "containers/postgresql/ssl" - "containers/postgresql/init" - "containers/postgresql/build" become: true - name: Deploy containerfile for build ansible.builtin.template: src: "{{ hostvars['console']['node']['config_path'] }}/services/containers/infra/postgresql/build/postgresql.containerfile.j2" dest: "{{ node['home_path'] }}/containers/postgresql/build/Containerfile" owner: "{{ ansible_user }}" group: "{{ node['group'] }}" mode: "0640" register: "is_postgresql_containerfile" notify: "notification_restart_postgresql" - name: Build postgresql container image containers.podman.podman_image: name: "{{ domain['internal'] }}/{{ node['name'] }}/postgres" # check tags from container file tag: "pg{{ version['containers']['postgresql'] }}-vectorchord{{ version['containers']['vectorchord'] }}" state: "build" path: "{{ node['home_path'] }}/containers/postgresql/build" force: "{{ is_postgresql_containerfile.changed }}" - name: Prune postgresql dangling images containers.podman.podman_prune: image: true - name: Deploy postgresql configuration files ansible.builtin.template: src: "{{ hostvars['console']['node']['config_path'] }}/services/containers/infra/postgresql/config/{{ item }}.j2" dest: "{{ node['home_path'] }}/containers/postgresql/config/{{ item }}" owner: "{{ services['postgresql']['subuid'] }}" group: "{{ node['group'] }}" mode: "0600" loop: - "postgresql.conf" - "pg_hba.conf" become: true notify: "notification_reload_postgresql" no_log: true - name: Deploy postgresql certificate and key ansible.builtin.copy: content: | {{ item.value }} dest: "{{ node['home_path'] }}/containers/postgresql/ssl/{{ item.name }}" owner: "{{ services['postgresql']['subuid'] }}" group: "{{ node['group'] }}" mode: "{{ item.mode }}" loop: - name: "{{ root_cert_filename }}" value: "{{ hostvars['console']['ca']['root']['crt'] }}" mode: "0440" - name: "postgresql.crt" value: | {{ hostvars['console']['postgresql']['crt'] | trim }} {{ hostvars['console']['ca']['intermediate']['crt'] }} mode: "0440" - name: "postgresql.key" value: "{{ hostvars['console']['postgresql']['key'] }}" mode: "0400" become: true notify: "notification_reload_postgresql" no_log: true - name: Check postgresql .init marker ansible.builtin.stat: path: "{{ node['home_path'] }}/containers/postgresql/.init" register: "is_postgresql_init_marker" - name: Check initiating SQL file ansible.builtin.find: path: "{{ node['home_path'] }}/data/containers/postgresql/backups/sql/" file_type: "file" patterns: - "pg_*.sql" hidden: true recurse: false become: true register: "postgresql_init_sql_files" - name: Remote copy the initiating SQL ansible.builtin.copy: src: "{{ node['home_path'] }}/data/containers/postgresql/backups/sql/pg_{{ item }}.sql" remote_src: true dest: "{{ node['home_path'] }}/containers/postgresql/init/{{ '%02d' | format(index_num) }}_pg_{{ item }}.sql" owner: "{{ services['postgresql']['subuid'] }}" group: "{{ node['group'] }}" mode: "0600" loop: "{{ ['cluster'] + connected_services }}" loop_control: index_var: index_num become: true when: - (connected_services | length) > 0 - not is_postgresql_init_marker.stat.exists - postgresql_init_sql_files.matched == (connected_services | length) + 1 - name: Deploy container file ansible.builtin.template: src: "{{ hostvars['console']['node']['config_path'] }}/services/containers/infra/postgresql/postgresql.container.j2" dest: "{{ node['home_path'] }}/.config/containers/systemd/postgresql.container" owner: "{{ ansible_user }}" group: "{{ node['group'] }}" mode: "0644" notify: "notification_restart_postgresql" - name: Deploy backup service files ansible.builtin.copy: src: "{{ hostvars['console']['node']['config_path'] }}/services/containers/infra/postgresql/services/{{ item }}" dest: "{{ node['home_path'] }}/.config/systemd/user/{{ item }}" owner: "{{ ansible_user }}" group: "{{ node['group'] }}" mode: "0644" loop: - "postgresql-cluster-backup.service" - "postgresql-cluster-backup.timer" - "postgresql-data-backup@.service" - "postgresql-data-backup@.timer" - name: Enable postgresql ansible.builtin.systemd: name: "postgresql.service" state: "started" enabled: true daemon_reload: true scope: "user" - name: Enable cluster backup timer ansible.builtin.systemd: name: "postgresql-cluster-backup.timer" state: "started" enabled: true daemon_reload: true scope: "user" - name: Enable data backup timer ansible.builtin.systemd: name: "postgresql-data-backup@{{ item }}.timer" state: "started" enabled: true daemon_reload: true scope: "user" loop: "{{ connected_services }}" - name: Create .init file ansible.builtin.file: path: "{{ node['home_path'] }}/containers/postgresql/.init" state: "touch" mode: "0644" owner: "{{ ansible_user }}" group: "{{ node['group'] }}" when: not is_postgresql_init_marker.stat.exists - name: Check container archive images ansible.builtin.stat: path: "{{ node['home_path'] }}/archives/containers/\ {{ domain['internal'] }}_{{ node['name'] }}_postgres_\ pg{{ version['containers']['postgresql'] }}-vectorchord{{ version['containers']['vectorchord'] }}.tar" register: container_archive_images - name: Save container archive images containers.podman.podman_save: image: - "{{ domain['internal'] }}/{{ node['name'] }}/postgres:pg{{ version['containers']['postgresql'] }}-vectorchord{{ version['containers']['vectorchord'] }}" dest: "{{ node['home_path'] }}/archives/containers/\ {{ domain['internal'] }}_{{ node['name'] }}_postgres_\ pg{{ version['containers']['postgresql'] }}-vectorchord{{ version['containers']['vectorchord'] }}.tar" format: "oci-archive" force: "{{ is_postgresql_containerfile.changed }}" when: not container_archive_images.stat.exists or is_postgresql_containerfile.changed - name: Fetch container archive images ansible.builtin.fetch: src: "{{ node['home_path'] }}/archives/containers/\ {{ domain['internal'] }}_{{ node['name'] }}_postgres_\ pg{{ version['containers']['postgresql'] }}-vectorchord{{ version['containers']['vectorchord'] }}.tar" dest: "{{ hostvars['console']['node']['data_path'] }}/images/containers/" flat: true