iac/aero/README.md

133 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```bash
# 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`):
```bash
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}`).
```bash
uv run ansible-playbook deploy.yml --check --diff # dry-run
uv run ansible-playbook deploy.yml # подготовка файлов
```
- Пароли генерируются один раз и персистятся на control-node в `aero/.secrets/`
(gitignored) — повторный прогон не меняет `.env` (идемпотентно).
- Только пароли и `.env`, без остального деплоя — отдельной командой:
```bash
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`. Ставятся при
необходимости:
```bash
uv run poe galaxy
```
## Настройка
Хосты — в [`inventory.ini`](inventory.ini) (группа `docker_hosts`). Root — через
`sudo` (`become`). Если `sudo` с паролем — добавьте `--ask-become-pass`:
```bash
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 # метаданные и зависимости
```