backlog: удалена задача shared-roles-sync, она реализована

- канон ролей лежит в ansible-roles, синхронизация идёт тасками
  roles-status / roles-pull / roles-push, подписка — eget и app_image
- драфт переведён в статус «реализовано»: отмечены расхождения с дизайном
  (имя канона, состав подписки) и незакрытые пункты плана
This commit is contained in:
av
2026-09-06 16:11:01 +03:00
parent af9d73a27c
commit 8aec606664
3 changed files with 22 additions and 32 deletions
-1
View File
@@ -29,7 +29,6 @@ _(sec-ревью)_ — три независимых security-ревью на м
- [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_ - [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_
- [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(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% - [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) _(ансибл-ревью)_ - [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_
- [Вывести из оборота секреты с широкими правами](narrow-secret-scopes.md) — `yc_oauth_token` (весь аккаунт Yandex Cloud) уже выведен; осталось проставить радиус остальным переменным vault и сузить широкие - [Вывести из оборота секреты с широкими правами](narrow-secret-scopes.md) — `yc_oauth_token` (весь аккаунт Yandex Cloud) уже выведен; осталось проставить радиус остальным переменным vault и сузить широкие
- [outline: секреты из файлов](secrets-file-outline.md) — умеет generic `<NAME>_FILE` для всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД - [outline: секреты из файлов](secrets-file-outline.md) — умеет generic `<NAME>_FILE` для всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД
-21
View File
@@ -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.
+22 -10
View File
@@ -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/` из актуальных 1. ~~Создать канон из актуальных ролей pet-project-server.~~ Сделано:
ролей pet-project-server (`owner`, `eget`, `secrets`). `~/projects/private/ansible-roles/roles/` с `eget` и `app_image`.
2. Добавить задачи `roles-pull` / `roles-push` / `roles-status` в 2. ~~Добавить задачи `roles-pull` / `roles-push` / `roles-status` в
`tasks.py` pet-project-server; объявить подписку на все три роли. `tasks.py` pet-project-server.~~ Сделано; подписка — `eget`, `app_image`.
3. То же в buckland; подписка только на `eget` (его копия сначала 3. То же в buckland; мёртвую `roles/owner` удалить.
выравнивается через `roles-pull` — дифф косметический, стиль 4. Подписать `owner` и `secrets`, когда их копии реально разойдутся.
кавычек). Мёртвую `roles/owner` удалить. 5. Предупреждение о дрейфе в lefthook — не сделано, пока хватает
4. Предупреждение о дрейфе в lefthook обоих репозиториев. ручного `inv roles-status`.
5. Новый сервер с самого начала строится на подписке. 6. Новый сервер с самого начала строится на подписке.