- name: Docker | Pull images docker_image: name: '{{item}}' source: pull with_items: - ubuntu - busybox - name: Docker Compose | Create a directory if it does not exist file: path: '{{directories.docker_compose_directory}}/{{item.name}}' state: directory mode: '0755' with_items: '{{services}}' - name: Docker Compose | Template Docker Compose Files template: src: '{{item.name}}.j2' dest: '{{directories.docker_compose_directory}}/{{item.name}}/docker-compose.yml' with_items: '{{services}}' - name: Directories | Ensure required directories file: path: '{{item}}' state: directory mode: '0755' with_items: - '{{dashy.config_directory}}' - '{{olivetin.config_directory}}' - '{{directories.backups_dir}}/.s3tmp' - name: Dashy | Config Files copy: src: '{{dashy.source_file}}' dest: '{{dashy.config_directory}}/{{dashy.config_file}}' notify: - restart-dashy - name: Olivetin | Config Files copy: src: '{{olivetin.source_file}}' dest: '{{olivetin.config_directory}}/{{olivetin.config_file}}' notify: - restart-olivetin - name: Install python dependencies (requests) pip: name: requests - name: Docker | Find docker volumes shell: docker volume ls -f name={{item.name}} --format '{{ '{{' }} .Name {{ '}}'}}' with_items: '{{services}}' register: find_volumes changed_when: false - debug: msg="{{ find_volumes.results | map(attribute='stdout_lines') | list | flatten }}" - name: Docker | Find volumes that need to be restored script: scripts/find-volumes-to-restore.py environment: EXISTING_VOLUMES: "{{ find_volumes.results | map(attribute='stdout_lines') | list | flatten }}" SERVICES: '{{ services }}' DOCKER_COMPOSE_DIR: '{{ directories.docker_compose_directory }}' args: executable: python3 register: python_output changed_when: false - debug: msg="{{ python_output.stdout_lines | list }}" - set_fact: restore_volumes: "{{ restore_volumes | default([]) + [{ 'volume_name': item}] }}" with_items: "{{ python_output.stdout_lines | list }}" - name: Restore any missing volumes from S3 include_role: name: chatton.docker_backup.docker_s3_volume_restore when: restore_volumes is defined ignore_errors: true vars: docker_backup_restore_force: false docker_backup_restore_latest_s3_key: true docker_backup_s3_restores: "{{ restore_volumes }}" - name: Docker | Create required docker networks docker_network: name: '{{item}}' with_items: '{{ docker_networks }}' - name: Portainer | Update Stack when: container_deployment_mode == "portainer" chatton.portainer.portainer_stack: username: admin password: '{{portainer.password}}' docker_compose_file_path: '{{ directories.docker_compose_directory }}/{{ item.name }}/docker-compose.yml' stack_name: '{{ item.name }}' endpoint_id: '{{ item.endpoint_id }}' state: present with_items: '{{services}}' - name: Docker compose | Update Stack when: container_deployment_mode == "compose" docker_compose: project_src: '{{directories.docker_compose_directory}}/{{ item.name }}' state: present with_items: '{{services}}' - name: Install Ansible pull tags: ["cron"] ansible.builtin.pip: name: - ansible # TODO: need to specify ansible pull directly, it doesn't find it when it's in PATH - name: Ensure Nightly Cron Backups tags: ["cron"] ansible.builtin.cron: name: backup docker volumes (nightly) weekday: "*" minute: "*" hour: "4" user: "{{ homelab_user }}" job: "/home/{{ homelab_user }}/.local/bin/ansible-pull -U https://github.com/chatton/ansible-homelab playbooks/backup-docker-volumes.yml -e schedule=nightly >> ~/logs/nightly.log 2>&1" cron_file: ansible_nightly_docker_volume_backup state: present - name: Ensure Monthly Cron Backups tags: ["cron"] ansible.builtin.cron: name: backup docker volumes (monthly) month: "*" day : "1" user: "{{ homelab_user }}" job: "/home/{{ homelab_user }}/.local/bin/ansible-pull -U https://github.com/chatton/ansible-homelab playbooks/backup-docker-volumes.yml -e schedule=monthly >> ~/logs/monthly.log 2>&1" cron_file: ansible_monthly_docker_volume_backup state: present