--- - name: Update Docker and Docker Compose hosts: all become: yes vars: # Версии для установки (если не указаны - будут последние) docker_version: "latest" docker_compose_version: "latest" # Очищать старые пакеты Docker перед установкой purge_old_docker: yes # Перезапускать контейнеры после обновления (нужно для обновления Docker Engine) restart_docker: yes tasks: - name: Include OS-specific variables include_vars: "{{ ansible_os_family }}.yml" ignore_errors: yes - name: Update apt cache (Debian/Ubuntu) apt: update_cache: yes cache_valid_time: 3600 when: ansible_os_family == "Debian" - name: Remove old Docker packages (if purge_old_docker is true) package: name: - docker - docker-engine - docker.io - containerd - runc state: absent when: purge_old_docker register: old_docker_removed - name: Install prerequisites for Docker repository package: name: - apt-transport-https - ca-certificates - curl - gnupg - lsb-release - software-properties-common state: present when: ansible_os_family == "Debian" - name: Add Docker GPG key (Debian/Ubuntu) apt_key: url: https://download.docker.com/linux/{{ ansible_distribution | lower }}/gpg state: present when: ansible_os_family == "Debian" - name: Add Docker repository (Debian/Ubuntu) apt_repository: repo: "deb [arch=amd64] https://download.docker.com/linux/{{ ansible_distribution | lower }} {{ ansible_distribution_release }} stable" state: present when: ansible_os_family == "Debian" - name: Install or update Docker CE (Debian/Ubuntu) apt: name: "docker-ce{% if docker_version != 'latest' %}={{ docker_version }}{% endif %}" state: "{{ 'present' if docker_version != 'latest' else 'latest' }}" update_cache: yes when: ansible_os_family == "Debian" notify: restart docker - name: Install Docker CE (RedHat/CentOS) yum: name: "docker-ce{% if docker_version != 'latest' %}-{{ docker_version }}{% endif %}" state: "{{ 'present' if docker_version != 'latest' else 'latest' }}" when: ansible_os_family == "RedHat" - name: Install Docker CE (Amazon Linux) yum: name: docker state: latest when: ansible_distribution == "Amazon" - name: Ensure Docker service is running and enabled systemd: name: docker state: started enabled: yes - name: Check current Docker Compose version command: docker-compose --version register: compose_current_version changed_when: false failed_when: false - name: Extract current version number set_fact: compose_current: "{{ compose_current_version.stdout | regex_replace('.*v', '') | regex_replace(',.*', '') }}" when: compose_current_version.rc == 0 - name: Get latest Docker Compose version from GitHub uri: url: https://api.github.com/repos/docker/compose/releases/latest return_content: yes register: github_release when: docker_compose_version == "latest" - name: Set Docker Compose version to install set_fact: compose_version_to_install: "{{ github_release.json.tag_name | regex_replace('^v', '') if docker_compose_version == 'latest' else docker_compose_version }}" when: docker_compose_version == "latest" or compose_current != docker_compose_version - name: Install or update Docker Compose get_url: url: "https://github.com/docker/compose/releases/download/v{{ compose_version_to_install }}/docker-compose-{{ ansible_system | lower }}-{{ ansible_architecture }}" dest: /usr/local/bin/docker-compose mode: '0755' force: yes when: (docker_compose_version == "latest" and (compose_current_version.rc != 0 or compose_current != compose_version_to_install)) or (docker_compose_version != "latest" and compose_current != docker_compose_version) - name: Verify Docker Compose installation command: docker-compose --version register: compose_new_version changed_when: false - name: Display Docker Compose version debug: msg: "Docker Compose updated to: {{ compose_new_version.stdout }}" - name: Clean up unused Docker packages (Debian/Ubuntu) apt: autoremove: yes purge: yes when: ansible_os_family == "Debian" and purge_old_docker handlers: - name: restart docker systemd: name: docker state: restarted when: restart_docker - name: restart docker on version change listen: "restart docker" systemd: name: docker state: restarted when: restart_docker