| .. | ||
| roles | ||
| .gitattributes | ||
| .gitignore | ||
| ansible.cfg | ||
| deploy.yml | ||
| inventory.ini | ||
| pyproject.toml | ||
| README.md | ||
| requirements.yml | ||
| site.yml | ||
| uv.lock | ||
aero — Ansible-провижининг docker-хостов
Ansible-роль docker, устанавливающая на сервер:
- Docker Engine (
docker-ce,docker-ce-cli); - containerd;
- docker compose и (где есть) buildx;
- обновление пакетов системы при старте.
Ветка установки выбирается автоматически по пакетному менеджеру хоста:
| Семейство | Пакетный менеджер | Пакеты |
|---|---|---|
| Ubuntu / Debian | apt |
docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
| RedOS / RHEL | dnf |
docker-ce docker-ce-cli containerd docker-compose |
Имена пакетов в RedOS отличаются (
containerd,docker-compose), поэтому списки разнесены по семействам вroles/docker/defaults/main.yml.
Важно: где запускать
Ansible не работает как управляющий узел на нативном Windows (нужен POSIX). Запуск — из WSL (Ubuntu). Управление окружением — через uv.
Разовая настройка WSL
# 1. uv внутри WSL
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.local/bin/env
# 2. Если DNS в WSL не резолвит (curl: Could not resolve host):
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
printf "\n[network]\ngenerateResolvConf = false\n" | sudo tee -a /etc/wsl.conf
# 3. SSH-ключ в домашку WSL с правами 600 (на /mnt/c ssh отвергает ключ)
mkdir -p ~/.ssh && chmod 700 ~/.ssh
cp /mnt/c/Users/user/.ssh/local/id_ed25519 ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
Запуск
Из WSL, в каталоге проекта (/mnt/c/.../iac/aero).
Установка с чистого листа — одной командой
uv run poe install
Последовательность: sync → galaxy → provision (базовые пакеты + docker
и запуск службы) → stack (деплой конфигурации + docker compose up -d
сервисов приложения) → superuser (генерация и создание Django-админа).
Перед запуском впишите хосты в inventory.ini и убедитесь, что
на control-node есть SSH-ключ и ~/.ssh/local/authorized_key.json для входа в
реестр.
Пошагово / отдельные команды
| Команда | Действие |
|---|---|
uv run poe ping |
проверка SSH + sudo |
uv run poe provision |
базовые пакеты + docker/containerd + запуск службы |
uv run poe deploy |
деплой конфигурации: файлы, .env, сертификаты, docker login |
uv run poe stack |
деплой + поднять стек (docker compose up -d) |
uv run poe gen-env |
только сгенерировать пароли и .env |
uv run poe login |
только docker login в реестр по ключу |
uv run poe superuser |
сгенерировать логин+пароль и создать Django-суперпользователя |
uv run poe check / deploy-check |
dry-run (--check --diff) |
Поднимаемые сервисы задаются в sarex_services (роль sarex_stack) —
postgres(+init), redis, rabbitmq, minio(+init), measurements,
backend, celery, frontend, nginx (k3s/gitea/processing не поднимаются).
ANSIBLE_CONFIGиUV_LINK_MODEзаданы в[tool.poe.env]— на дискеC:(через/mnt/c) права0777, и ansible игнорируетansible.cfgв world-writable каталоге, поэтому путь к конфигу передаётся явно.
Развёртывание sarex-стека (роль sarex_stack)
Копирует docker-compose.yaml, nginx/templates и backend/uwsgi.ini в
/root/sarex, рендерит .env из .env.example со сгенерированными паролями
и доменами *.sarex.local.lonsdaleites.ru, генерирует самоподписанный
TLS-сертификат на все три домена (nginx/certs/selfsigned.{crt,key}), логинится
в реестр и (при sarex_compose_up=true) поднимает сервисы приложения.
Роли/базы и MinIO-бакеты создаются одноразовыми postgres-init/minio-init.
uv run ansible-playbook deploy.yml --check --diff # dry-run
uv run ansible-playbook deploy.yml # подготовка файлов
-
Пароли генерируются один раз и персистятся на control-node в
aero/.secrets/(gitignored) — повторный прогон не меняет.env(идемпотентно). -
Только пароли и
.env, без остального деплоя — отдельной командой:uv run poe gen-env # сгенерировать/обновить .env rm -rf .secrets/<host> && uv run poe gen-env # перегенерировать пароли заново -
Стек по умолчанию не поднимается (
sarex_compose_up: false). Образы — приватные (cr.yandex), поэтому сперваdocker login cr.yandexна хосте, затемcd /root/sarex && docker compose up -d(или прогон с-e sarex_compose_up=true). -
Домены нужно завести в DNS/hosts, чтобы они резолвились на хост.
Galaxy-коллекции (опционально)
Коллекции из requirements.yml (community.docker и др.) не требуются для
работы роли — она использует только модули ansible.builtin. Ставятся при
необходимости:
uv run poe galaxy
Настройка
Хосты — в inventory.ini (группа docker_hosts). Root — через
sudo (become). Если sudo с паролем — добавьте --ask-become-pass:
uv run poe play -- --ask-become-pass
Переменные роли (roles/docker/defaults/main.yml):
| Переменная | По умолчанию | Назначение |
|---|---|---|
docker_update_packages |
true |
Обновлять пакеты при старте |
docker_upgrade_dist |
false |
Полный dist-upgrade (только Debian) |
docker_service_enabled |
true |
Автозапуск службы docker |
docker_service_state |
started |
Состояние службы после прогона |
docker_users |
[] |
Пользователи в группу docker (без sudo) |
docker_redhat_add_ce_repo |
false |
Внешний репозиторий Docker CE (RHEL; RedOS не нужен) |
Структура
aero/
├── pyproject.toml # окружение uv + poe-задачи
├── ansible.cfg # настройки ansible (inventory, become)
├── requirements.yml # galaxy-коллекции (опционально)
├── inventory.ini # хосты
├── site.yml # плейбук
└── roles/docker/
├── defaults/main.yml # переменные и списки пакетов по семействам
├── tasks/
│ ├── main.yml # диспетчер по пакетному менеджеру + общие шаги
│ ├── debian.yml # ветка apt (Ubuntu/Debian)
│ └── redhat.yml # ветка dnf (RedOS/RHEL)
├── handlers/main.yml # restart docker
└── meta/main.yml # метаданные и зависимости