Skip to content

Commit 392ddec

Browse files
committed
backup-and-restore: use archive/unarchive approach
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> (cherry picked from commit dffe7b4)
1 parent e1e5cb5 commit 392ddec

File tree

1 file changed

+34
-55
lines changed

1 file changed

+34
-55
lines changed

infrastructure-playbooks/backup-and-restore-ceph-files.yml

+34-55
Original file line numberDiff line numberDiff line change
@@ -54,74 +54,53 @@
5454
- name: backup mode
5555
when: mode == 'backup'
5656
block:
57-
- name: find files
58-
find:
59-
paths:
60-
- /etc/ceph
61-
- /var/lib/ceph
62-
recurse: yes
63-
register: file_to_backup
57+
- name: create a temp directory
58+
ansible.builtin.tempfile:
59+
state: directory
60+
suffix: ansible-archive-ceph
61+
register: tmp_dir
62+
delegate_to: "{{ target_node }}"
63+
64+
- name: archive files
65+
archive:
66+
path: "{{ item }}"
67+
dest: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar"
68+
format: tar
6469
delegate_to: "{{ target_node }}"
70+
loop:
71+
- /etc/ceph
72+
- /var/lib/ceph
73+
74+
- name: create backup directory
75+
become: false
76+
file:
77+
path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}"
78+
state: directory
6579

6680
- name: backup files
6781
fetch:
68-
src: "{{ item.path }}"
69-
dest: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/{{ item.path }}"
82+
src: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar"
83+
dest: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/backup{{ item | replace('/', '-') }}.tar"
7084
flat: yes
71-
loop: "{{ file_to_backup.files }}"
85+
loop:
86+
- /etc/ceph
87+
- /var/lib/ceph
7288
delegate_to: "{{ target_node }}"
7389

74-
- name: preserve mode on files
90+
- name: remove temp directory
7591
file:
76-
path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/{{ item.path }}"
77-
mode: "{{ item.mode }}"
78-
owner: "{{ item.uid }}"
79-
group: "{{ item.gid }}"
80-
loop: "{{ file_to_backup.files }}"
92+
path: "{{ tmp_dir.path }}"
93+
state: absent
94+
delegate_to: "{{ target_node }}"
8195

8296
- name: restore mode
8397
when: mode == 'restore'
8498
block:
85-
- name: stat directories
86-
stat:
87-
path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}{{ item }}"
88-
register: dir_stat
99+
- name: unarchive files
100+
ansible.builtin.unarchive:
101+
src: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/backup{{ item | replace('/', '-') }}.tar"
102+
dest: "{{ item | dirname }}"
89103
loop:
90104
- /etc/ceph
91105
- /var/lib/ceph
92-
93-
- name: get a list of files to be restored
94-
find:
95-
paths:
96-
- "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}"
97-
recurse: yes
98-
register: file_to_restore
99-
100-
- name: create a list of directories to create
101-
set_fact:
102-
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}]) }}"
103-
loop: "{{ dir_stat.results }}"
104-
delegate_to: "{{ target_node }}"
105-
106-
- name: create a liste of sub-directories to create
107-
set_fact:
108-
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}]) }}"
109-
loop: "{{ file_to_restore.files }}"
110-
111-
- name: ensure directories are created
112-
file:
113-
state: directory
114-
path: "{{ item.path }}"
115-
mode: "{{ item.mode }}"
116-
owner: "{{ item.uid }}"
117-
group: "{{ item.gid }}"
118-
loop: "{{ dir_to_create + subdir_to_create }}"
119106
delegate_to: "{{ target_node }}"
120-
121-
- name: restore files
122-
copy:
123-
src: "{{ item.path }}"
124-
dest: "{{ item.path | replace(backup_dir + '/' + hostvars[target_node]['ansible_facts']['hostname'], '') }}"
125-
mode: preserve
126-
loop: "{{ file_to_restore.files }}"
127-
delegate_to: "{{ target_node }}"

0 commit comments

Comments
 (0)