Files
ansible/update-docker.yml

145 lines
4.9 KiB
YAML

---
- 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