--- - name: Check whether Docker is available ansible.builtin.command: argv: - docker - info register: portainer_docker_info changed_when: false failed_when: false - name: Find and update Portainer when: portainer_docker_info.rc == 0 block: - name: List all container IDs ansible.builtin.command: argv: - docker - container - ls - --all - --quiet register: portainer_all_containers changed_when: false - name: Inspect all container images ansible.builtin.command: argv: >- {{ ['docker', 'container', 'inspect'] + portainer_all_containers.stdout_lines }} register: portainer_container_inspection changed_when: false when: portainer_all_containers.stdout_lines | length > 0 - name: Select installed Portainer editions ansible.builtin.set_fact: portainer_installed_images: >- {{ (portainer_container_inspection.stdout | default('[]') | from_json) | map(attribute='Config.Image') | select('match', '^(?:[^/]+/)?portainer/(?:portainer|portainer-(?:ce|ee))(?::|@|$)') | unique | list }} - name: Update Portainer to the newest release ansible.builtin.command: argv: - docker - run - --rm - --pull - always - --volume - /var/run/docker.sock:/var/run/docker.sock - "{{ portainer_updater_image }}" - portainer - >- --image={{ 'portainer/portainer-ee:' ~ portainer_target_tag if 'portainer-ee' in item else 'portainer/portainer-ce:' ~ portainer_target_tag }} loop: "{{ portainer_installed_images }}" loop_control: label: "{{ item }}" register: portainer_update changed_when: true when: - portainer_installed_images | length > 0 - not ansible_check_mode - name: Report when no Portainer server is installed ansible.builtin.debug: msg: No Portainer CE or Business Edition server container found; skipping. when: portainer_installed_images | length == 0