--- - name: Get PostgreSQL configuration k8s_info: kind: Secret namespace: '{{ ansible_operator_meta.namespace }}' name: "{{ this_awx['resources'][0]['status']['postgresConfigurationSecret'] }}" register: pg_config no_log: "{{ no_log }}" - name: Fail if postgres configuration secret status does not exist fail: msg: "The postgresConfigurationSecret status is not set on the AWX object yet or the secret has been deleted." when: not pg_config | default([]) | length - name: Store Database Configuration set_fact: awx_postgres_user: "{{ pg_config['resources'][0]['data']['username'] | b64decode }}" awx_postgres_pass: "{{ pg_config['resources'][0]['data']['password'] | b64decode }}" awx_postgres_database: "{{ pg_config['resources'][0]['data']['database'] | b64decode }}" awx_postgres_port: "{{ pg_config['resources'][0]['data']['port'] | b64decode }}" awx_postgres_host: "{{ pg_config['resources'][0]['data']['host'] | b64decode }}" awx_postgres_type: "{{ pg_config['resources'][0]['data']['type'] | default('unmanaged'|b64encode) | b64decode }}" no_log: "{{ no_log }}" - block: - name: Delete pod to reload a resource configuration set_fact: postgres_label_selector: "app.kubernetes.io/instance=postgres-{{ supported_pg_version }}-{{ deployment_name }}" when: postgres_label_selector is not defined - name: Get the postgres pod information k8s_info: kind: Pod namespace: '{{ ansible_operator_meta.namespace }}' label_selectors: - "{{ postgres_label_selector }}" register: postgres_pod until: - "postgres_pod['resources'] | length" - "postgres_pod['resources'][0]['status']['phase'] == 'Running'" - "postgres_pod['resources'][0]['status']['containerStatuses'][0]['ready'] == true" delay: 5 retries: 60 - name: Set the resource pod name as a variable. set_fact: postgres_pod_name: "{{ postgres_pod['resources'][0]['metadata']['name'] }}" when: awx_postgres_type == 'managed' - name: Determine the timestamp for the backup once for all nodes set_fact: now: '{{ lookup("pipe", "date +%F-%H%M%S") }}' - name: Set backup directory name set_fact: backup_dir: "/backups/tower-openshift-backup-{{ now }}" - name: Create directory for backup k8s_exec: namespace: "{{ backup_pvc_namespace }}" pod: "{{ ansible_operator_meta.name }}-db-management" container: "{{ ansible_operator_meta.name }}-db-management" command: >- mkdir -p {{ backup_dir }} - name: Precreate file for database dump k8s_exec: namespace: "{{ backup_pvc_namespace }}" pod: "{{ ansible_operator_meta.name }}-db-management" container: "{{ ansible_operator_meta.name }}-db-management" command: >- touch {{ backup_dir }}/tower.db - name: Set resolvable_db_host set_fact: resolvable_db_host: '{{ (awx_postgres_type == "managed") | ternary(awx_postgres_host + "." + ansible_operator_meta.namespace + ".svc", awx_postgres_host) }}' # yamllint disable-line rule:line-length no_log: "{{ no_log }}" - name: Get the current resource task pod information. k8s_info: api_version: v1 kind: Pod namespace: '{{ ansible_operator_meta.namespace }}' label_selectors: - "app.kubernetes.io/name={{ deployment_name }}-task" - "app.kubernetes.io/managed-by={{ deployment_type }}-operator" - "app.kubernetes.io/component={{ deployment_type }}" field_selectors: - status.phase=Running register: awx_task_pod - name: Set the resource pod as a variable. set_fact: awx_task_pod: >- {{ awx_task_pod['resources'] | rejectattr('metadata.deletionTimestamp', 'defined') | sort(attribute='metadata.creationTimestamp') | first | default({}) }} - name: Set the resource pod name as a variable. set_fact: awx_task_pod_name: "{{ awx_task_pod['metadata']['name'] | default('') }}" - name: Precreate database partitions k8s_exec: namespace: "{{ ansible_operator_meta.namespace }}" pod: "{{ awx_task_pod_name }}" container: "{{ deployment_name }}-task" command: awx-manage precreate_partitions --count='{{ precreate_partition_hours }}' when: precreate_partition_hours > 0 register: result changed_when: "'Created partitions for' in result.stdout" - name: Set pg_dump command set_fact: pgdump: >- pg_dump --clean --create -h {{ resolvable_db_host }} -U {{ awx_postgres_user }} -d {{ awx_postgres_database }} -p {{ awx_postgres_port }} -F custom {{ pg_dump_suffix }} no_log: "{{ no_log }}" - name: Write pg_dump to backup on PVC k8s_exec: namespace: "{{ backup_pvc_namespace }}" pod: "{{ ansible_operator_meta.name }}-db-management" container: "{{ ansible_operator_meta.name }}-db-management" command: | bash -c " function end_keepalive { rc=$? rm -f \"$1\" kill $(cat /proc/$2/task/$2/children 2>/dev/null) 2>/dev/null || true wait $2 || true exit $rc } keepalive_file=\"$(mktemp)\" while [[ -f \"$keepalive_file\" ]]; do echo 'Dumping data from database...' sleep 60 done & keepalive_pid=$! trap 'end_keepalive \"$keepalive_file\" \"$keepalive_pid\"' EXIT SIGINT SIGTERM echo keepalive_pid: $keepalive_pid set -e -o pipefail PGPASSWORD='{{ awx_postgres_pass }}' {{ pgdump }} > {{ backup_dir }}/tower.db set +e +o pipefail echo 'Successful' " register: data_migration no_log: "{{ no_log }}" failed_when: "'Successful' not in data_migration.stdout"