diff --git a/ansible/homelab/playbooks/restore-all.yml b/ansible/homelab/playbooks/restore-all.yml new file mode 100644 index 0000000..2db032b --- /dev/null +++ b/ansible/homelab/playbooks/restore-all.yml @@ -0,0 +1,19 @@ +### +# restore-all restores a manually specified list of volumes. +# This is intended for user when initially setting up a home lab environment +# and want to restore all applications from existing backups +# +# Restores will be skipped if there is no archive in the backup directory. +# +# If a container exists, it will be stopped, restored and started +# If a container does not exist, the volume will be still be created. +### + +--- +- name: Redeploy Portainer and All Volumes + hosts: servers + tasks: + - name: Restore Tautulli + import_tasks: ../tasks/restore-volume-tasks.yml + vars: + container_name: "tautulli" diff --git a/ansible/homelab/playbooks/volume-restore.yml b/ansible/homelab/playbooks/volume-restore.yml index 1ed917e..3057fc3 100644 --- a/ansible/homelab/playbooks/volume-restore.yml +++ b/ansible/homelab/playbooks/volume-restore.yml @@ -1,31 +1,9 @@ ### Example: -# ansible-playbook -v ansible/volume-restore.yml -e "container_name=mariadb" +# ansible-playbook -v ansible/playbooks/volume-restore.yml -e "container_name=mariadb" --- - hosts: servers tasks: - - name: Find volumes - ansible.builtin.shell: docker run --rm - -v /var/run/docker.sock:/var/run/docker.sock - -v /mnt/hdds/backups/:/mnt/hdds/backups/ - ghcr.io/chatton/docker-volume-backup:master - list-backups - --host-path /mnt/hdds/backups/ - --volume-name-filter {{container_name}} - --newest-only - register: out - - name: Stop the container - docker_container: - name: "{{container_name}}" - state: stopped - - name: Restore Volume - ansible.builtin.command: docker run --rm - -v /var/run/docker.sock:/var/run/docker.sock - ghcr.io/chatton/docker-volume-backup:master - restore-volume - --volume {{item.volumeName}} - --archive {{item.absoluteFilePath}} - with_items: "{{ out.stdout }}" - - name: Start the container - docker_container: - name: "{{container_name}}" - state: started + - name: Restore Volume + import_tasks: ../tasks/restore-volume-tasks.yml + vars: + container_name: "{{ container_name }}" diff --git a/ansible/homelab/tasks/restore-volume-tasks.yml b/ansible/homelab/tasks/restore-volume-tasks.yml new file mode 100644 index 0000000..9e2700f --- /dev/null +++ b/ansible/homelab/tasks/restore-volume-tasks.yml @@ -0,0 +1,40 @@ +--- +# https://stackoverflow.com/questions/45237632/ansible-w-docker-show-current-container-state +- name: Get container info + docker_container_info: + name: "{{container_name}}" + register: result +# We find the volumes +- name: Find volumes + ansible.builtin.shell: docker run --rm + -v /var/run/docker.sock:/var/run/docker.sock + -v /mnt/hdds/backups/:/mnt/hdds/backups/ + ghcr.io/chatton/docker-volume-backup:master + list-backups + --host-path /mnt/hdds/backups/ + --volume-name-filter {{container_name}} + --newest-only + register: out + +- name: Stop the container + # not out.stdout is search("null") occurs when there is no volume in the backups dir + when: result.exists and not out.stdout is search("null") + docker_container: + name: "{{container_name}}" + state: stopped +- name: Restore Volume + ansible.builtin.command: docker run --rm + -v /var/run/docker.sock:/var/run/docker.sock + ghcr.io/chatton/docker-volume-backup:master + restore-volume + --volume {{item.volumeName}} + --archive {{item.absoluteFilePath}} + with_items: "{{ out.stdout }}" + # the output will be "null" if there are no backups. We simply skip if this is the case + when: not out.stdout is search("null") +- name: Start the container + # not out.stdout is search("null") occurs when there is no volume in the backups dir + when: result.exists and not out.stdout is search("null") + docker_container: + name: "{{container_name}}" + state: started