feat: добавлена универсальная роль docker и обновлена документация
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled

- Создана универсальная роль docker для установки Docker и Docker Compose
- Поддержка Debian, Ubuntu, CentOS, AlmaLinux, Rocky, RHEL
- Установка через официальный репозиторий или get.docker.com
- Полностью переписана документация README.md с актуальной информацией
- Добавлен preset mytest для тестирования
- Обновлен roles/deploy.yml с актуальными ролями

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
Сергей Антропов
2025-10-26 00:58:00 +03:00
parent 304a5e4ebf
commit b41c110c16
11 changed files with 1047 additions and 1990 deletions

2200
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,46 @@
---
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
- name: u1
family: ubuntu22
groups: [test]
- name: u2
family: debian12
groups: [test]
- name: u3
family: centos9
groups: [test]

View File

@@ -6,5 +6,6 @@
- name: Развертывание всех ролей
hosts: all
roles:
- ping
# - ping
# - devops
- docker

View File

@@ -19,6 +19,33 @@
devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}"
when: devops_os_name is defined
# Проверка существования групп перед созданием пользователя
- name: "Проверка существования групп"
getent:
database: "group"
key: "{{ item }}"
register: group_check
failed_when: false
changed_when: false
loop: "{{ devops_user_groups }}"
when: devops_user_groups is defined
# Фильтрация только существующих групп
- name: "Фильтрация существующих групп"
set_fact:
devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}"
when: group_check is defined
# Создание отсутствующих групп (если необходимо)
- name: "Создание группы docker если она не существует"
group:
name: "docker"
state: "present"
become: true
when:
- "'docker' in devops_user_groups"
- "'docker' not in (devops_existing_groups | default([]))"
# Генерация безопасного пароля для пользователя devops
- name: "Генерация безопасного пароля для пользователя devops"
set_fact:
@@ -31,7 +58,7 @@
name: "{{ devops_user.name }}"
home: "{{ devops_user.home }}"
shell: "{{ devops_user.shell }}"
groups: "{{ devops_user_groups }}"
groups: "{{ devops_existing_groups | default(devops_user_groups) }}"
create_home: "{{ devops_user.create_home }}"
state: "{{ devops_user.state }}"
password: "{{ devops_user_password | password_hash('sha512') }}"
@@ -67,6 +94,17 @@
validate: "{{ devops_sudo_validate }}"
become: true
# Добавление пользователя в группу docker (если группа существует)
- name: "Добавление пользователя в группу docker"
user:
name: "{{ devops_user.name }}"
groups: "{{ devops_user_groups }}"
append: true
become: true
when:
- "'docker' in devops_user_groups"
- "'docker' in (devops_existing_groups | default([]))"
# Логирование успешного создания пользователя
- name: "Логирование создания пользователя devops"
debug:

193
roles/docker/README.md Normal file
View File

@@ -0,0 +1,193 @@
# Роль docker
## Описание
Универсальная роль Ansible для установки и настройки Docker и Docker Compose на различных Linux-дистрибутивах.
Роль автоматически определяет семейство ОС (Debian/Ubuntu или Red Hat/CentOS/AlmaLinux) и использует соответствующий метод установки.
**Поддерживаемые ОС:**
- Debian 9/10/11/12
- Ubuntu 20.04/22.04/24.04
- CentOS 7/8/9
- AlmaLinux 8/9
- Rocky Linux 8/9
- RHEL 8/9
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Переменные
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `docker_version` | `"latest"` | Версия Docker CE для установки |
| `docker_compose_version` | `"latest"` | Версия Docker Compose (для standalone версии) |
| `docker_use_official_repo` | `true` | Использовать официальный репозиторий Docker |
| `docker_use_compose_plugin` | `true` | Использовать docker-compose-plugin вместо standalone |
| `docker_users` | `[]` | Список пользователей для добавления в группу docker |
| `docker_service_enabled` | `true` | Автозапуск Docker при загрузке |
| `docker_service_state` | `started` | Состояние службы Docker |
| `docker_additional_packages` | `[]` | Дополнительные пакеты для установки |
| `docker_install_method` | `"official"` | Метод установки: 'official' или 'get.docker.com' |
## Примеры использования
### Базовое использование
```yaml
- hosts: all
roles:
- docker
```
### Установка с добавлением пользователей
```yaml
- hosts: all
roles:
- role: docker
vars:
docker_users:
- ansible
- deploy
```
### Установка через скрипт get.docker.com
```yaml
- hosts: all
roles:
- role: docker
vars:
docker_install_method: "get.docker.com"
docker_use_official_repo: false
```
### Установка standalone Docker Compose
```yaml
- hosts: all
roles:
- role: docker
vars:
docker_use_compose_plugin: false
docker_compose_version: "2.23.0"
```
### Установка с дополнительными пакетами
```yaml
- hosts: all
roles:
- role: docker
vars:
docker_additional_packages:
- docker-ce-rootless-extras
```
## Зависимости
Нет зависимостей от других ролей.
## Требования
- Ansible 2.9+
- Python 3.6+
- Права sudo на целевых хостах
- Доступ к интернету для загрузки пакетов
## Что делает роль
1. Определяет семейство ОС (Debian или Red Hat)
2. Устанавливает необходимые зависимости
3. Добавляет официальный репозиторий Docker
4. Устанавливает Docker CE и Docker Compose
5. Запускает и включает службу Docker
6. Создает группу docker
7. Добавляет пользователей в группу docker
8. Проверяет корректность установки
## Проверка установки
После выполнения роли проверьте установку:
```bash
# Проверка версии Docker
docker --version
# Проверка версии Docker Compose
docker compose version
# или
docker-compose --version
# Проверка статуса службы
systemctl status docker
# Проверка информации о Docker
docker info
```
## Пример playbook для тестирования
```yaml
---
- name: Установка Docker на все хосты
hosts: all
become: yes
roles:
- role: docker
vars:
docker_users:
- ansible
docker_use_compose_plugin: true
post_tasks:
- name: Запуск тестового контейнера
docker_container:
name: hello-world
image: hello-world:latest
state: started
- name: Проверка запущенных контейнеров
command: docker ps -a
register: docker_ps
changed_when: false
- name: Вывод списка контейнеров
debug:
var: docker_ps.stdout_lines
```
## Troubleshooting
### Docker не запускается
Проверьте журналы systemd:
```bash
sudo journalctl -u docker.service
```
### Проблемы с репозиторием
Для Ubuntu/Debian, если репозиторий не добавляется:
```bash
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
```
### Проблемы с правами
Если пользователь не может запускать docker без sudo:
```bash
sudo usermod -aG docker $USER
# Выйдите и войдите снова
```
## Лицензия
MIT
## Автор
Сергей Антропов - https://devops.org.ru

View File

@@ -0,0 +1,33 @@
---
# Переменные по умолчанию для роли docker
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Версия Docker CE
docker_version: "latest"
# Версия Docker Compose (если не используется docker-compose-plugin)
docker_compose_version: "latest"
# Использовать ли официальный репозиторий Docker (рекомендуется)
docker_use_official_repo: true
# Использовать ли docker-compose-plugin (вместо standalone docker-compose)
docker_use_compose_plugin: true
# Пользователь для добавления в группу docker
docker_users: []
# - ansible
# - deploy
# Автозапуск Docker при загрузке системы
docker_service_enabled: true
# Автозапуск Docker при загрузке системы
docker_service_state: started
# Дополнительные пакеты для установки
docker_additional_packages: []
# Метод установки: 'official' (официальный репозиторий) или 'get.docker.com' (скрипт)
docker_install_method: "get.docker.com"

104
roles/docker/examples.yml Normal file
View File

@@ -0,0 +1,104 @@
---
# Примеры использования роли docker
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Базовый пример установки Docker
hosts: all
become: yes
roles:
- docker
- name: Установка Docker с добавлением пользователей
hosts: all
become: yes
roles:
- role: docker
vars:
docker_users:
- ansible
- deploy
- developer
- name: Установка Docker через скрипт get.docker.com
hosts: all
become: yes
roles:
- role: docker
vars:
docker_install_method: "get.docker.com"
docker_use_official_repo: false
- name: Установка Docker с standalone Docker Compose
hosts: all
become: yes
roles:
- role: docker
vars:
docker_use_compose_plugin: false
docker_compose_version: "2.23.0"
- name: Установка Docker с дополнительными пакетами
hosts: all
become: yes
roles:
- role: docker
vars:
docker_additional_packages:
- docker-ce-rootless-extras
- name: Полный пример с тестированием
hosts: all
become: yes
roles:
- role: docker
vars:
docker_users:
- ansible
docker_use_compose_plugin: true
post_tasks:
- name: Проверка версии Docker
command: docker --version
register: docker_version
changed_when: false
failed_when: false
- name: Вывод версии Docker
debug:
msg: "{{ docker_version.stdout }}"
- name: Проверка версии Docker Compose
shell: |
if command -v docker compose &> /dev/null; then
docker compose version
elif command -v docker-compose &> /dev/null; then
docker-compose --version
fi
register: docker_compose_version
changed_when: false
failed_when: false
- name: Вывод версии Docker Compose
debug:
msg: "{{ docker_compose_version.stdout }}"
- name: Запуск тестового контейнера
docker_container:
name: hello-world
image: hello-world:latest
state: started
- name: Проверка запущенных контейнеров
command: docker ps -a
register: docker_ps
changed_when: false
- name: Вывод списка контейнеров
debug:
var: docker_ps.stdout_lines
- name: Удаление тестового контейнера
docker_container:
name: hello-world
state: absent

View File

@@ -0,0 +1,22 @@
---
# Обработчики для роли docker
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Restart docker
become: true
systemd:
name: docker
state: restarted
- name: Reload docker
become: true
systemd:
name: docker
state: reloaded
- name: Restart docker socket
become: true
systemd:
name: docker.socket
state: restarted

View File

@@ -0,0 +1,35 @@
---
galaxy_info:
author: Сергей Антропов
description: Универсальная роль Ansible для установки и настройки Docker и Docker Compose на различных Linux-дистрибутивах
company: https://devops.org.ru
license: MIT
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- noble
- name: Debian
versions:
- stretch
- buster
- bullseye
- bookworm
- name: EL
versions:
- "7"
- "8"
- "9"
- name: Rocky
versions:
- "8.0"
- "9.0"
galaxy_tags:
- docker
- dockercompose
- container
- virtualization
- linux
dependencies: []

250
roles/docker/tasks/main.yml Normal file
View File

@@ -0,0 +1,250 @@
---
# Задачи для роли docker
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Определяем семейство ОС для выбора правильного метода установки
- name: Определение семейства ОС
set_fact:
docker_os_family: "{{ ansible_os_family }}"
docker_pkg_manager: "{{ 'yum' if ansible_pkg_mgr == 'yum' else ('dnf' if ansible_pkg_mgr == 'dnf' else 'apt') }}"
# Устанавливаем предварительные зависимости
- name: Установка зависимостей для Debian/Ubuntu
become: true
apt:
name:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
- software-properties-common
state: present
update_cache: yes
when: ansible_os_family == "Debian"
- name: Установка зависимостей для Red Hat
become: true
package:
name:
- yum-utils
- device-mapper-persistent-data
- lvm2
state: present
when: ansible_os_family == "RedHat"
failed_when: false
# Добавляем официальный репозиторий Docker для Debian/Ubuntu
- name: Добавление GPG ключа Docker для Debian/Ubuntu
become: true
shell: |
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/{{ (ansible_distribution | lower) }}/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
args:
creates: /etc/apt/keyrings/docker.asc
when:
- ansible_os_family == "Debian"
- docker_use_official_repo
- name: Добавление репозитория Docker для Debian/Ubuntu
become: true
apt_repository:
repo: "deb [arch={{ ansible_architecture }} signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/{{ (ansible_distribution | lower) }} {{ ansible_distribution_release }} stable"
state: present
filename: docker
update_cache: yes
when:
- ansible_os_family == "Debian"
- docker_use_official_repo
# Добавляем официальный репозиторий Docker для Red Hat
- name: Добавление репозитория Docker для Red Hat через dnf
become: true
shell: |
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
args:
creates: /etc/yum.repos.d/docker-ce.repo
when:
- ansible_os_family == "RedHat"
- ansible_pkg_mgr == "dnf"
- docker_use_official_repo
failed_when: false
- name: Добавление репозитория Docker для Red Hat через yum-config-manager
become: true
shell: |
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
args:
creates: /etc/yum.repos.d/docker-ce.repo
when:
- ansible_os_family == "RedHat"
- ansible_pkg_mgr == "yum"
- docker_use_official_repo
failed_when: false
# Устанавливаем Docker через официальный репозиторий
- name: Установка Docker CE для Debian/Ubuntu (официальный репозиторий)
become: true
apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
state: "{{ 'present' if docker_version == 'latest' else docker_version }}"
update_cache: yes
when:
- ansible_os_family == "Debian"
- docker_use_official_repo
- docker_install_method == "official"
- name: Установка Docker CE для Red Hat (официальный репозиторий)
become: true
package:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
state: "{{ 'present' if docker_version == 'latest' else docker_version }}"
when:
- ansible_os_family == "RedHat"
- docker_use_official_repo
- docker_install_method == "official"
# Устанавливаем Docker через скрипт get.docker.com
- name: Проверка наличия Docker
stat:
path: /usr/bin/docker
register: docker_binary
- name: Скачивание скрипта установки Docker
become: true
get_url:
url: https://get.docker.com
dest: /tmp/get-docker.sh
mode: '0755'
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- not docker_binary.stat.exists
- name: Установка Docker через скрипт get.docker.com
become: true
command: /tmp/get-docker.sh
args:
creates: /usr/bin/docker
when:
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
- not docker_binary.stat.exists
- name: Проверка установки Docker
become: true
command: docker --version
register: docker_version_check
changed_when: false
failed_when: false
- name: Вывод версии Docker
debug:
msg: "{{ docker_version_check.stdout if docker_version_check.rc == 0 else 'Docker не установлен' }}"
# Устанавливаем docker-compose-plugin для Debian/Ubuntu
- name: Установка docker-compose-plugin для Debian/Ubuntu
become: true
apt:
name:
- docker-compose-plugin
state: present
when:
- ansible_os_family == "Debian"
- docker_use_compose_plugin
- docker_use_official_repo
# Устанавливаем docker-compose-plugin для Red Hat
- name: Установка docker-compose-plugin для Red Hat
become: true
package:
name:
- docker-compose-plugin
state: present
when:
- ansible_os_family == "RedHat"
- docker_use_compose_plugin
- docker_use_official_repo
# Устанавливаем standalone docker-compose
- name: Скачивание docker-compose
become: true
get_url:
url: "https://github.com/docker/compose/releases/{{ 'latest/download' if docker_compose_version == 'latest' else 'download/v' + docker_compose_version }}/docker-compose-{{ ansible_system }}-{{ ansible_machine }}"
dest: /usr/local/bin/docker-compose
mode: '0755'
when:
- not docker_use_compose_plugin or docker_compose_version != 'latest'
- name: Проверка установки Docker Compose
become: true
shell: |
set -o pipefail
if command -v docker compose &> /dev/null; then
docker compose version
elif command -v docker-compose &> /dev/null; then
docker-compose --version
else
echo "Docker Compose не установлен"
fi
register: docker_compose_version_check
changed_when: false
failed_when: false
- name: Вывод версии Docker Compose
debug:
msg: "{{ docker_compose_version_check.stdout if docker_compose_version_check.rc == 0 else 'Docker Compose не установлен' }}"
# Запускаем и включаем службу Docker
- name: Запуск службы Docker
become: true
systemd:
name: docker
state: started
enabled: yes
# Создаем группу docker
- name: Создание группы docker
become: true
group:
name: docker
state: present
# Добавляем пользователей в группу docker
- name: Добавление пользователей в группу docker
become: true
user:
name: "{{ item }}"
groups: docker
append: yes
loop: "{{ docker_users }}"
when: docker_users | length > 0
# Устанавливаем дополнительные пакеты
- name: Установка дополнительных пакетов
become: true
package:
name: "{{ docker_additional_packages }}"
state: present
when: docker_additional_packages | length > 0
# Проверка статуса Docker
- name: Проверка статуса Docker
become: true
command: docker info
register: docker_info
changed_when: false
failed_when: false
- name: Вывод информации о Docker
debug:
msg: "Docker успешно установлен и запущен"
when: docker_info.rc == 0

View File

@@ -0,0 +1,89 @@
---
# Тестовый playbook для роли docker
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Тестирование установки Docker
hosts: all
become: yes
roles:
- role: docker
vars:
docker_users:
- ansible
post_tasks:
- name: Проверка установки Docker
command: docker --version
register: docker_version_check
changed_when: false
failed_when: false
- name: Проверка установки Docker Compose
shell: |
if command -v docker compose &> /dev/null; then
docker compose version
elif command -v docker-compose &> /dev/null; then
docker-compose --version
else
echo "Docker Compose не найден"
exit 1
fi
register: docker_compose_check
changed_when: false
failed_when: false
- name: Вывод результатов проверки
debug:
msg:
- "Docker: {{ docker_version_check.stdout }}"
- "Docker Compose: {{ docker_compose_check.stdout }}"
- name: Проверка статуса службы Docker
systemd:
name: docker
register: docker_service
changed_when: false
- name: Вывод статуса службы
debug:
msg: "Docker service is {{ docker_service.status.ActiveState }}"
- name: Проверка группы docker
group:
name: docker
register: docker_group_check
- name: Вывод информации о группе
debug:
msg: "Group docker exists with gid {{ docker_group_check.group.gid }}"
- name: Запуск тестового контейнера
docker_container:
name: test-container
image: alpine:latest
command: echo "Hello from Docker"
state: started
- name: Проверка запущенных контейнеров
command: docker ps -a
register: docker_ps
changed_when: false
- name: Вывод списка контейнеров
debug:
var: docker_ps.stdout_lines
- name: Удаление тестового контейнера
docker_container:
name: test-container
state: absent
- name: Проверка успешного завершения теста
assert:
that:
- docker_version_check.rc == 0
- docker_compose_check.rc == 0
- docker_service.status.ActiveState == "active"
fail_msg: "Тестирование не пройдено"
success_msg: "Все тесты пройдены успешно"