133 lines
6.7 KiB
Markdown
133 lines
6.7 KiB
Markdown
# 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 # метаданные и зависимости
|
||
```
|