--- - name: "Stack {{ portainer_stack_name }} | Create a directory if it does not exist" ansible.builtin.file: path: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}' state: directory mode: '0755' - name: "Stack {{ portainer_stack_name }} | Template Docker Compose File" ansible.builtin.template: src: '{{ portainer_stack_name }}.j2' dest: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}/docker-compose.yml' owner: root group: root mode: 0440 vars: template_vars: "{{ portainer_stack_template_vars }}" - name: "Stack {{ portainer_stack_name }} | Ensure required directories" ansible.builtin.file: path: '{{ item }}' state: directory mode: '0755' with_items: "{{ portainer_stack_directories }}" - name: "Stack {{ portainer_stack_name }} | Find docker volumes" ansible.builtin.shell: docker volume ls -f name={{ portainer_stack_name }} --format '{{ '{{' }} .Name {{ '}}' }}' register: find_volumes changed_when: false - name: "Stack {{ portainer_stack_name }} | Find docker volumes that need to be restored" ansible.builtin.script: scripts/find-volumes-to-restore.py environment: EXISTING_VOLUMES: "{{ find_volumes.stdout_lines }}" STACK_NAME: '{{ portainer_stack_name }}' DOCKER_COMPOSE_DIR: '{{ directories.docker_compose_directory }}' args: executable: python3 register: python_output changed_when: false - name: "Stack {{ portainer_stack_name }} | Build list of volumes to restore." ansible.builtin.set_fact: restore_volumes: "{{ restore_volumes | default([]) + [{'volume_name':item}] }}" with_items: "{{ python_output.stdout_lines | list }}" - name: "Stack {{ portainer_stack_name }} | Restore any missing volumes from S3" ansible.builtin.include_role: name: chatton.docker_backup.docker_s3_volume_restore when: restore_volumes is defined vars: docker_backup_restore_force: false docker_backup_restore_latest_s3_key: true docker_backup_s3_restores: "{{ restore_volumes }}" - name: "Stack {{ portainer_stack_name }} | Update Portainer." chatton.portainer.portainer_stack: username: admin password: '{{ portainer.password }}' docker_compose_file_path: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}/docker-compose.yml' stack_name: '{{ portainer_stack_name }}' endpoint_id: '{{ portainer_stack_endpoint_id }}' state: present