]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
backup-and-restore: use archive/unarchive approach
authorGuillaume Abrioux <gabrioux@redhat.com>
Thu, 7 Jul 2022 15:03:34 +0000 (17:03 +0200)
committerGuillaume Abrioux <gabrioux@redhat.com>
Thu, 7 Jul 2022 15:11:19 +0000 (17:11 +0200)
current approach is too complex and causes too many issues permission
issues.

Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2051640
Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
infrastructure-playbooks/backup-and-restore-ceph-files.yml

index 30da772d992a24e2fa260e360f95b6443bb68f3d..aec8f47f8cb49568412c2b22fb13556b4a407608 100644 (file)
     - name: backup mode
       when: mode == 'backup'
       block:
-        - name: find files
-          find:
-            paths:
-              - /etc/ceph
-              - /var/lib/ceph
-            recurse: yes
-          register: file_to_backup
+        - name: create a temp directory
+          ansible.builtin.tempfile:
+            state: directory
+            suffix: ansible-archive-ceph
+          register: tmp_dir
+          delegate_to: "{{ target_node }}"
+
+        - name: archive files
+          archive:
+            path: "{{ item }}"
+            dest: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar"
+            format: tar
           delegate_to: "{{ target_node }}"
+          loop:
+            - /etc/ceph
+            - /var/lib/ceph
+
+        - name: create backup directory
+          become: false
+          file:
+            path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}"
+            state: directory
 
         - name: backup files
           fetch:
-            src: "{{ item.path }}"
-            dest: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/{{ item.path }}"
+            src: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar"
+            dest: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/backup{{ item | replace('/', '-') }}.tar"
             flat: yes
-          loop: "{{ file_to_backup.files }}"
+          loop:
+            - /etc/ceph
+            - /var/lib/ceph
           delegate_to: "{{ target_node }}"
 
-        - name: preserve mode on files
+        - name: remove temp directory
           file:
-            path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/{{ item.path }}"
-            mode: "{{ item.mode }}"
-            owner: "{{ item.uid }}"
-            group: "{{ item.gid }}"
-          loop: "{{ file_to_backup.files }}"
+            path: "{{ tmp_dir.path }}"
+            state: absent
+          delegate_to: "{{ target_node }}"
 
     - name: restore mode
       when: mode == 'restore'
       block:
-        - name: stat directories
-          stat:
-            path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}{{ item }}"
-          register: dir_stat
+        - name: unarchive files
+          ansible.builtin.unarchive:
+            src: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/backup{{ item | replace('/', '-') }}.tar"
+            dest: "{{ item | dirname }}"
           loop:
             - /etc/ceph
             - /var/lib/ceph
-
-        - name: get a list of files to be restored
-          find:
-            paths:
-              - "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}"
-            recurse: yes
-          register: file_to_restore
-
-        - name: create a list of directories to create
-          set_fact:
-            dir_to_create: "{{ dir_to_create | default([]) | union([{'path': item.item | replace(backup_dir + '/' + hostvars[target_node]['ansible_facts']['hostname'], ''), 'uid': item.stat.uid, 'gid': item.stat.gid, 'mode': item.stat.mode}]) }}"
-          loop: "{{ dir_stat.results }}"
-          delegate_to: "{{ target_node }}"
-
-        - name: create a liste of sub-directories to create
-          set_fact:
-            subdir_to_create: "{{ subdir_to_create | default([]) | union([{'path': item.path | dirname | replace(backup_dir + '/' + hostvars[target_node]['ansible_facts']['hostname'], ''), 'uid': item.uid, 'gid': item.gid, 'mode': item.mode}]) }}"
-          loop: "{{ file_to_restore.files }}"
-
-        - name: ensure directories are created
-          file:
-            state: directory
-            path: "{{ item.path }}"
-            mode: "{{ item.mode }}"
-            owner: "{{ item.uid }}"
-            group: "{{ item.gid }}"
-          loop: "{{ dir_to_create + subdir_to_create }}"
           delegate_to: "{{ target_node }}"
-
-        - name: restore files
-          copy:
-            src: "{{ item.path }}"
-            dest: "{{ item.path | replace(backup_dir + '/' + hostvars[target_node]['ansible_facts']['hostname'], '') }}"
-            mode: preserve
-          loop: "{{ file_to_restore.files }}"
-          delegate_to: "{{ target_node }}"
\ No newline at end of file