--- # Copyright Red Hat # SPDX-License-Identifier: Apache-2.0 # # This playbook can help in order to backup some Ceph files and restore them later. # # Usage: # # ansible-playbook -i backup-and-restore-ceph-files.yml -e backup_dir= -e mode= -e target_node= # # Required run-time variables # ------------------ # backup_dir : a path where files will be read|write. # mode : tell the playbook either to backup or restore files. # target_node : the name of the node being processed, it must match the name set in the inventory. # # Examples # -------- # ansible-playbook -i hosts, backup-and-restore-ceph-files.yml -e backup_dir=/usr/share/ceph-ansible/backup-ceph-files -e mode=backup -e target_node=mon01 # ansible-playbook -i hosts, backup-and-restore-ceph-files.yml -e backup_dir=/usr/share/ceph-ansible/backup-ceph-files -e mode=restore -e target_node=mon01 - name: Backup and restore Ceph files hosts: localhost become: true gather_facts: true tasks: - name: Exit playbook, if user did not set the source node ansible.builtin.fail: msg: > "You must pass the node name: -e target_node=. The name must match what is set in your inventory." when: - target_node is not defined or target_node not in groups.get('all', []) - name: Exit playbook, if user did not set the backup directory ansible.builtin.fail: msg: > "you must pass the backup directory path: -e backup_dir=" when: backup_dir is not defined - name: Exit playbook, if user did not set the playbook mode (backup|restore) ansible.builtin.fail: msg: > "you must pass the mode: -e mode=" when: - mode is not defined or mode not in ['backup', 'restore'] - name: Gather facts on source node ansible.builtin.setup: delegate_to: "{{ target_node }}" delegate_facts: true - name: Backup mode when: mode == 'backup' block: - name: Create a temp directory ansible.builtin.tempfile: state: directory suffix: ansible-archive-ceph register: tmp_dir delegate_to: "{{ target_node }}" - name: Archive files community.general.archive: path: "{{ item }}" dest: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar" format: tar mode: "0644" delegate_to: "{{ target_node }}" loop: - /etc/ceph - /var/lib/ceph - name: Create backup directory become: false ansible.builtin.file: path: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}" state: directory mode: "0755" - name: Backup files ansible.builtin.fetch: src: "{{ tmp_dir.path }}/backup{{ item | replace('/', '-') }}.tar" dest: "{{ backup_dir }}/{{ hostvars[target_node]['ansible_facts']['hostname'] }}/backup{{ item | replace('/', '-') }}.tar" flat: true loop: - /etc/ceph - /var/lib/ceph delegate_to: "{{ target_node }}" - name: Remove temp directory ansible.builtin.file: path: "{{ tmp_dir.path }}" state: absent delegate_to: "{{ target_node }}" - name: Restore mode when: mode == 'restore' block: - 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 delegate_to: "{{ target_node }}"