fix(delivery): add PostgreSQL rollback and CloudDM isolation
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
---
|
||||
- name: Roll back native PostgreSQL delivery instances
|
||||
hosts: "{{ target_hosts }}"
|
||||
become: true
|
||||
gather_facts: false
|
||||
any_errors_fatal: true
|
||||
vars:
|
||||
postgresql_instance_plan: "{{ postgresql_instances[inventory_hostname] | default({}) }}"
|
||||
postgresql_instance_id: "{{ postgresql_instance_plan.instance_id | default('') }}"
|
||||
postgresql_data_root: /data/postgresql
|
||||
postgresql_instance_root: "{{ postgresql_data_root }}/{{ postgresql_instance_id }}"
|
||||
postgresql_data_dir: "{{ postgresql_instance_plan.data_dir | default('') }}"
|
||||
postgresql_config_dir: "{{ postgresql_instance_plan.config_dir | default('') }}"
|
||||
postgresql_log_dir: "{{ postgresql_instance_plan.log_dir | default('') }}"
|
||||
postgresql_systemd_unit: "{{ postgresql_instance_plan.systemd_unit | default('') }}"
|
||||
postgresql_dropin_dir: "/etc/systemd/system/{{ postgresql_systemd_unit }}.d"
|
||||
postgresql_run_dir: "/run/postgresql-xinfra/{{ postgresql_instance_id }}"
|
||||
|
||||
pre_tasks:
|
||||
- name: Validate PostgreSQL rollback target
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- postgresql_instance_plan is mapping
|
||||
- postgresql_instance_id is match('^[a-z0-9][a-z0-9-]{0,62}$')
|
||||
- postgresql_instance_root == '/data/postgresql/' + postgresql_instance_id
|
||||
- postgresql_data_dir == postgresql_instance_root + '/data'
|
||||
- postgresql_config_dir == postgresql_instance_root + '/conf'
|
||||
- postgresql_log_dir == postgresql_instance_root + '/log'
|
||||
- postgresql_systemd_unit == 'postgresql-xinfra@' + postgresql_instance_id + '.service'
|
||||
- postgresql_instance_root != '/data/postgresql'
|
||||
- "'..' not in postgresql_instance_root"
|
||||
fail_msg: "Rollback target is outside the native PostgreSQL delivery layout"
|
||||
quiet: true
|
||||
|
||||
tasks:
|
||||
- name: Stop the PostgreSQL delivery instance when present
|
||||
ansible.builtin.systemd_service:
|
||||
name: "{{ postgresql_systemd_unit }}"
|
||||
state: stopped
|
||||
enabled: false
|
||||
failed_when: false
|
||||
|
||||
- name: Reset the PostgreSQL instance failure state
|
||||
ansible.builtin.command:
|
||||
argv:
|
||||
- systemctl
|
||||
- reset-failed
|
||||
- "{{ postgresql_systemd_unit }}"
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: Remove the PostgreSQL instance systemd drop-in
|
||||
ansible.builtin.file:
|
||||
path: "{{ postgresql_dropin_dir }}"
|
||||
state: absent
|
||||
|
||||
- name: Remove the PostgreSQL instance data, configuration, and logs
|
||||
ansible.builtin.file:
|
||||
path: "{{ postgresql_instance_root }}"
|
||||
state: absent
|
||||
|
||||
- name: Remove the PostgreSQL instance runtime directory
|
||||
ansible.builtin.file:
|
||||
path: "{{ postgresql_run_dir }}"
|
||||
state: absent
|
||||
|
||||
- name: Reload systemd after removing the instance drop-in
|
||||
ansible.builtin.systemd_service:
|
||||
daemon_reload: true
|
||||
|
||||
- name: Confirm PostgreSQL instance artifacts are gone
|
||||
ansible.builtin.stat:
|
||||
path: "{{ item }}"
|
||||
loop:
|
||||
- "{{ postgresql_dropin_dir }}"
|
||||
- "{{ postgresql_instance_root }}"
|
||||
- "{{ postgresql_run_dir }}"
|
||||
register: postgresql_rollback_artifacts
|
||||
|
||||
- name: Assert all PostgreSQL instance artifacts are gone
|
||||
ansible.builtin.assert:
|
||||
that:
|
||||
- not item.stat.exists
|
||||
fail_msg: "PostgreSQL rollback left an instance artifact on the target host"
|
||||
quiet: true
|
||||
loop: "{{ postgresql_rollback_artifacts.results }}"
|
||||
Reference in New Issue
Block a user