/
/
/
Ansible role that can run restic backups and push it to a remote storage server.
1---
2# Restore one /docker/<svc> directory from its latest snapshot on this host.
3
4- name: "{{ svc }} - Find the latest snapshot on {{ inventory_hostname }}"
5 ansible.builtin.command:
6 argv: ["{{ backup_restic_bin }}", snapshots, --json, --latest, "1", --host, "{{ inventory_hostname }}", --tag, "{{ svc }}"]
7 environment:
8 RESTIC_REPOSITORY: "{{ restic_repo }}"
9 RESTIC_PASSWORD: "{{ restic_password }}"
10 register: _rs_snapshots
11 changed_when: false
12
13- name: "{{ svc }} - Pick the snapshot"
14 ansible.builtin.set_fact:
15 _rs_snapshot: "{{ (_rs_snapshots.stdout | from_json | sort(attribute='time') | last) if (_rs_snapshots.stdout | from_json | length > 0) else {} }}"
16
17- name: "{{ svc }} - Fail if there is no snapshot"
18 ansible.builtin.fail:
19 msg: "No snapshot with tag {{ svc }} for host {{ inventory_hostname }}"
20 when: _rs_snapshot | length == 0
21
22- name: "{{ svc }} - Find its running containers"
23 community.docker.docker_host_info:
24 containers: true
25 containers_filters:
26 label: "com.docker.compose.project={{ svc }}"
27 status: running
28 register: _rs_info
29
30- name: "{{ svc }} - Remember the running containers"
31 ansible.builtin.set_fact:
32 _rs_running: "{{ _rs_info.containers | map(attribute='Names') | map('first') | map('regex_replace', '^/', '') | sort }}"
33
34- name: "{{ svc }} - Restore snapshot {{ _rs_snapshot.short_id }} from {{ _rs_snapshot.time[:19] }}"
35 block:
36 - name: "{{ svc }} - Stop running containers"
37 ansible.builtin.command:
38 argv: "{{ ['docker', 'stop', '--time', '60'] + _rs_running }}"
39 when: _rs_running | length > 0
40
41 - name: "{{ svc }} - Remove the current directory"
42 ansible.builtin.file:
43 path: "{{ backup_docker_root }}/{{ svc }}"
44 state: absent
45
46 - name: "{{ svc }} - restic restore"
47 ansible.builtin.command:
48 argv:
49 - "{{ backup_restic_bin }}"
50 - restore
51 - "{{ _rs_snapshot.id }}"
52 - --target
53 - /
54 - --include
55 - "{{ backup_docker_root }}/{{ svc }}"
56 environment:
57 RESTIC_REPOSITORY: "{{ restic_repo }}"
58 RESTIC_PASSWORD: "{{ restic_password }}"
59 changed_when: true
60
61 always:
62 - name: "{{ svc }} - Start the containers that were running"
63 ansible.builtin.command:
64 argv: "{{ ['docker', 'start'] + _rs_running }}"
65 when: _rs_running | length > 0
66
67- name: "{{ svc }} - Restored"
68 ansible.builtin.debug:
69 msg: >-
70 {{ svc }} restored from snapshot {{ _rs_snapshot.short_id }} ({{ _rs_snapshot.time[:19] }}).
71 Restarted: {{ _rs_running | join(', ') or 'nothing was running' }}.
72