tripleo-ansible/tripleo_ansible/playbooks/undercloud_backup.yaml
apetrich edfe84f274 Add the undercloud backup ansible playbook
This playbook reflects the same behaviour as the mistral workbook
of the same name.
It adds the functionality discussed on this external bug
https://bugzilla.redhat.com/show_bug.cgi?id=1659888

Change-Id: Icf964c23745941dd596f65e2b0bfa81e515508d0
2019-08-29 10:30:25 +02:00

140 lines
4.4 KiB
YAML

---
# Copyright 2019 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
- name: TripleO Undercloud backup workflows
hosts: undercloud
gather_facts: false
any_errors_fatal: true
max_fail_percentage: 0
vars:
sources_path: '/home/stack/'
handlers:
# Perform some cleanup
- name: cleanup the backup
become: true
file:
path: "{{ item }}"
state: absent
with_items:
- "{{ bkp_path }}"
- "{{ tmpdir.path }}/"
pre_tasks:
# Action to know if there is enough available space
# to run the Undercloud backup
- name: Get free space
shell: |
set -o pipefail
if [[ $(df -T /var/tmp | tail -n 1 | awk '{print $2}') == "btrfs" ]]; then
btrfs fi usage --gbytes / | awk '/^.*Free / {print $3}'| sed 's/\..*//'
else
df -BG /var/tmp | awk '!/^Filesystem/ {print $4}' | sed 's/G//'
fi
register: var_space_available
- name: Fail if any of the volumes are too small
fail:
msg: >
Minimum free space required for /var/tmp: 10G
- current free space: {{ var_space_available.stdout|int |round(1) }}G
when:
- (var_space_available.stdout | int) < 10
tasks:
- name: Create a timestamp variable
set_fact:
timestamp: "{{ lookup('pipe','date +%Y%m%d%H%M%S') }}"
- name: Create staging directory
tempfile:
state: directory
prefix: "undercloud-backup-"
path: "/var/tmp"
register: tmpdir
notify:
- cleanup the backup
# The Undercloud database password for the root
# user is stored in a Mistral environment, we
# need the password in order to run the database dump
- name: get_database_credentials
shell: |-
set -o pipefail
mistral environment-get tripleo.undercloud-config -f json | jq -r ".Variables" | jq -r ".undercloud_db_password"
register: undercloud_db_password
- name: Create the names for the temporary backup files
set_fact:
db_path: "{{ tmpdir.path }}/all-databases-{{ timestamp }}.sql.gz"
fs_path: "{{ tmpdir.path }}/filesystem-{{ timestamp }}.sql.gz"
bkp_path: "/tmp/UC-backup-{{ timestamp }}.tar"
# We use the undercloud database password for the root
# to backup the databases
- name: Backup the databases
become: true
shell: |-
set -o pipefail
podman exec -i mysql mysqldump -u root -p{{ undercloud_db_password.stdout }} --opt --all-databases | gzip > {{ db_path }}
- name: Backup the filesystem
become: true
shell: |
tar --xattrs --ignore-failed-read -C / -cf {{ fs_path }} {{ sources_path }}
chown stack. {{ fs_path }}
- name: compress all the files in tar.gz
archive:
path: "{{ tmpdir.path }}"
dest: "{{ bkp_path }}"
format: tar
notify:
- cleanup the backup
- name: Swift save block
when:
- save_swift is defined and save_swift
block:
- name: Save the backup to swift
shell: |-
swift upload --header "X-Delete-After: 86400" undercloud-backups {{ bkp_path }}
- name: Backup saved
debug:
msg: "The undercloud backup was saved to swift"
- name: Local save block
when:
- save_swift is not defined or not save_swift
block:
- name: Create the backup directory
become: true
file:
path: /var/lib/tripleo/backups
state: directory
mode: '0755'
- name: Copy backup file
become: true
copy:
src: "{{ bkp_path }}"
dest: "/var/lib/tripleo/backups/{{ bkp_path | basename }}"
remote_src: true
- name: Print out the backup location
debug:
msg: >-
The undercloud backup was saved in
"/var/lib/tripleo/backups/{{ bkp_path | basename }}"