6.7 KiB
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 sync # окружение (uv сам поставит нужный Python)
uv run poe ping # проверка SSH + sudo
uv run poe check # dry-run (--check --diff), ничего не меняет
uv run poe play # боевой прогон роли
Одной командой всё сразу: uv run poe up (sync → galaxy → play).
ANSIBLE_CONFIGиUV_LINK_MODEзаданы в[tool.poe.env]— на дискеC:(через/mnt/c) права0777, и ansible игнорируетansible.cfgв world-writable каталоге, поэтому путь к конфигу передаётся явно.
Развёртывание sarex-стека (роль sarex_stack)
Копирует docker-compose.yaml, nginx/ и postgres/initdb в /root/sarex,
рендерит .env из .env.example со сгенерированными паролями и доменами
*.sarex.local.lonsdaleites.ru, генерирует самоподписанный TLS-сертификат на
все три домена (nginx/certs/selfsigned.{crt,key}).
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 # метаданные и зависимости