From 8aec606664f77575ec4ee471c2ec8816bdd4f321 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sun, 6 Sep 2026 16:11:01 +0300 Subject: [PATCH] =?UTF-8?q?backlog:=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20shared-roles-sy?= =?UTF-8?q?nc,=20=D0=BE=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - канон ролей лежит в ansible-roles, синхронизация идёт тасками roles-status / roles-pull / roles-push, подписка — eget и app_image - драфт переведён в статус «реализовано»: отмечены расхождения с дизайном (имя канона, состав подписки) и незакрытые пункты плана --- docs/backlog/README.md | 1 - docs/backlog/shared-roles-sync.md | 21 -------------------- docs/drafts/shared-roles-sync.md | 32 +++++++++++++++++++++---------- 3 files changed, 22 insertions(+), 32 deletions(-) delete mode 100644 docs/backlog/shared-roles-sync.md diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 113d03f..6a3a292 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -29,7 +29,6 @@ _(sec-ревью)_ — три независимых security-ревью на м - [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_ - [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(sec-ревью)_ - [Gitea runner on-demand в Yandex Cloud](gitea-runner-on-demand.md) — раннер активен только во время сборки; webhook→Cloud Function стартует ВМ, probe/decide гасят по idle; экономия ~95% -- [Синхронизация общих Ansible-ролей между репозиториями](shared-roles-sync.md) — `owner`/`eget`/`secrets` дублируются между репозиториями и дрейфуют; канон в ansible-shared + rsync-таски invoke - [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_ - [Вывести из оборота секреты с широкими правами](narrow-secret-scopes.md) — `yc_oauth_token` (весь аккаунт Yandex Cloud) уже выведен; осталось проставить радиус остальным переменным vault и сузить широкие - [outline: секреты из файлов](secrets-file-outline.md) — умеет generic `_FILE` для всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД diff --git a/docs/backlog/shared-roles-sync.md b/docs/backlog/shared-roles-sync.md deleted file mode 100644 index aaf7071..0000000 --- a/docs/backlog/shared-roles-sync.md +++ /dev/null @@ -1,21 +0,0 @@ -# Синхронизация общих Ansible-ролей между репозиториями - -**Приоритет:** средний - -Серверы управляются изолированными репозиториями (pet-project-server, buckland, -далее — торрент-бокс). Кастомные роли (`owner`, `eget`, `secrets`) концептуально -общие, но физически продублированы и дрейфуют (`owner` в buckland стал мёртвым -кодом). Решение под pets-подход: канон ролей в `~/projects/private/ansible-shared/`, -каждый репозиторий держит закоммиченную копию (она же «пин версии») и -синхронизируется через rsync-таски invoke — `roles-pull` / `roles-push` / -`roles-status`. Подписка на роли явная и пер-серверная (`SYNCED_ROLES` в -`tasks.py`). Обновление роли на сервере — осознанный коммит с читаемым диффом, не -скрытый сайд-эффект. Предохранитель от дрейфа — предупреждение в lefthook. -Отвергнуты: общий `roles_path`, симлинки, submodule/subtree, galaxy-из-git, -монорепо (все ломают самодостаточность или вводят лишнюю петлю). - -Подход обсуждён, реализация не начата. Полный дизайн + план внедрения: -[docs/drafts/shared-roles-sync.md](../drafts/shared-roles-sync.md). - -Связано: roles/owner, roles/eget, roles/secrets, tasks.py, lefthook.yml, -project_isolated_repos_shared_roles, project_shared_invoke_command_surface. diff --git a/docs/drafts/shared-roles-sync.md b/docs/drafts/shared-roles-sync.md index 479271c..9a30163 100644 --- a/docs/drafts/shared-roles-sync.md +++ b/docs/drafts/shared-roles-sync.md @@ -2,7 +2,19 @@ ## Статус -Черновик. Подход обсуждён, реализация не начата. +Реализовано. Канон живёт в `~/projects/private/ansible-roles/` (репозиторий +с git-историей), таски `roles-status` / `roles-pull` / `roles-push` есть в +`tasks.py`. Отличия от первоначального дизайна: + +- канон называется `ansible-roles`, а не `ansible-shared`, и сразу заведён + как git-репозиторий; +- подписка pet-project-server — `SYNCED_ROLES = ["eget", "app_image"]`: + `app_image` появился уже после дизайна и писался сразу общим, а `owner` и + `secrets` пока остаются локальными копиями и подписываются по мере надобности; +- предупреждения о дрейфе в lefthook нет — расхождение ловится ручным + `inv roles-status`. + +Ниже — исходный дизайн; текст оставлен как спека подхода. ## Контекст @@ -197,12 +209,12 @@ galaxy-источника: повесить теги, перевести реп ## План внедрения -1. Создать `~/projects/private/ansible-shared/roles/` из актуальных - ролей pet-project-server (`owner`, `eget`, `secrets`). -2. Добавить задачи `roles-pull` / `roles-push` / `roles-status` в - `tasks.py` pet-project-server; объявить подписку на все три роли. -3. То же в buckland; подписка только на `eget` (его копия сначала - выравнивается через `roles-pull` — дифф косметический, стиль - кавычек). Мёртвую `roles/owner` удалить. -4. Предупреждение о дрейфе в lefthook обоих репозиториев. -5. Новый сервер с самого начала строится на подписке. +1. ~~Создать канон из актуальных ролей pet-project-server.~~ Сделано: + `~/projects/private/ansible-roles/roles/` с `eget` и `app_image`. +2. ~~Добавить задачи `roles-pull` / `roles-push` / `roles-status` в + `tasks.py` pet-project-server.~~ Сделано; подписка — `eget`, `app_image`. +3. То же в buckland; мёртвую `roles/owner` удалить. +4. Подписать `owner` и `secrets`, когда их копии реально разойдутся. +5. Предупреждение о дрейфе в lefthook — не сделано, пока хватает + ручного `inv roles-status`. +6. Новый сервер с самого начала строится на подписке.