Ansible: единственный инвентарь production.yml

- production.yml переписан на живой Timeweb-хост, timeweb.yml удалён,
  HOSTS_FILE в tasks.py и примеры в README поправлены
- host-vars application_dir и mount_external_storage не перенесены: это
  наследие YC-диска, а после переезда в group_vars инвентарь их перебивает
- ansible.cfg: inventory по умолчанию, чтобы забытый -i не уводил в никуда
This commit is contained in:
av
2026-07-24 21:15:12 +03:00
parent 9c156df0c7
commit 4d976585ec
9 changed files with 12 additions and 49 deletions
+2 -2
View File
@@ -43,7 +43,7 @@ uv run ansible-galaxy install --role-file requirements.yml
Деплой приложения через ansible:
```bash
uv run ansible-playbook ansible-playbook -i timeweb.yml --diff playbook-gitea.yml
uv run ansible-playbook -i production.yml --diff playbook-gitea.yml
```
Или через таску invoke:
@@ -55,5 +55,5 @@ uv run ansible-playbook ansible-playbook -i timeweb.yml --diff playbook-gitea.ym
## Удаление приложения <name>
```bash
uv run ansible-playbook -i timeweb.yml --diff playbook-remove-user-and-app.yml --extra-vars user_name=<name>
uv run ansible-playbook -i production.yml --diff playbook-remove-user-and-app.yml --extra-vars user_name=<name>
```
+1
View File
@@ -1,4 +1,5 @@
[defaults]
inventory = ./production.yml
host_key_checking = True
vault_password_file = ./ansible-vault-password-file
roles_path = ./galaxy.roles
-1
View File
@@ -31,7 +31,6 @@ _(sec-ревью)_ — три независимых security-ревью на м
- [Понизить log level Authelia до info](authelia-log-level.md) — `debug` в проде утекает детали аутентификации и OIDC через `docker logs`/dozzle _(sec-ревью)_
- [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_
- [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(sec-ревью)_
- [Убрать устаревший инвентарь после миграции](stale-inventory-cleanup.md) — `production.yml` указывает на мёртвый YC-хост, живой — `timeweb.yml`; имена инвертированы
- [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
- [Уведомления о размере приложений и диске](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_
+5 -8
View File
@@ -2,17 +2,14 @@
**Приоритет:** низкий
- **`production.yml` и `timeweb.yml`** оба объявляют хост `server` под
`ungrouped:`, хост-специфичные данные (`application_dir`,
`mount_external_storage`, `ansible_host`, `ansible_user`) вписаны инлайн.
Конвенциональнее `host_vars/server.yml` и хост в именованной группе. Два
инвентаря с одинаковым именем хоста + `hosts: all` — ошибка `-i` молча уедет не
туда. (`timeweb.yml` — артефакт завершённой миграции, заодно решить, нужен ли
он ещё.)
- **`production.yml`** объявляет хост `server` под `ungrouped:`,
хост-специфичные данные (`ansible_host`, `ansible_user`, `ansible_become`)
вписаны инлайн. Конвенциональнее — `host_vars/server.yml` и хост в именованной
группе, а не в `ungrouped`.
- `ansible_become: true` глобально — всё бежит под root. Для личного сервера
прагматично; точечный `become`/`become_user` ближе к наименьшим привилегиям, но
это низкий приоритет.
Контекст: [docs/drafts/ansible-review.md](../drafts/ansible-review.md) §6.
Связано: production.yml, timeweb.yml.
Связано: production.yml.
+2 -2
View File
@@ -12,7 +12,7 @@
Почему всё равно стоит закрыть:
- **Наименьшие привилегии.** Ansible ходит под непривилегированным `major` с
`become` (`production.yml`/`timeweb.yml`), root-логин для деплоя не нужен вовсе.
`become` (`production.yml`), root-логин для деплоя не нужен вовсе.
- **Defense-in-depth.** Если `PasswordAuthentication` когда-нибудь вернётся в
`yes` (правка, `Match`-блок, чужая роль), `PermitRootLogin yes` тут же откроет
root по паролю. `prohibit-password` держит root key-only независимо.
@@ -22,5 +22,5 @@
Из sec-ревью (fable, 2026-07-13); мотивировка уточнена после проверки конфига.
Связано: playbook-system.yml, production.yml, timeweb.yml,
Связано: playbook-system.yml, production.yml,
galaxy.roles/geerlingguy.security.
-25
View File
@@ -1,25 +0,0 @@
# Убрать устаревший инвентарь после миграции на Timeweb
**Приоритет:** средний
После переезда на Timeweb (cutover 2026-05-23) имена инвентарей инвертировались:
- `timeweb.yml``92.53.105.41`**живой** хост, именно его использует `inv pl`
(`tasks.py:12` `HOSTS_FILE = "timeweb.yml"`).
- `production.yml``158.160.46.255`**мёртвый** старый YC-хост (ВМ
остановлена). При этом AGENTS.md всё ещё называет `production.yml` рабочим
инвентарём.
Ловушка: любой прямой запуск `ansible-playbook -i production.yml ...` (как в
примерах AGENTS.md) уедет на несуществующий/чужой хост. Плюс `production.yml`
содержит `application_dir`/`mount_external_storage`, которых нет в `timeweb.yml`
простой заменой файла эти переменные потеряются.
Сделать: сделать `production.yml` актуальным инвентарём Timeweb-хоста (перенести
недостающие host-vars), удалить `timeweb.yml`, поправить `HOSTS_FILE` в `tasks.py`
и примеры в AGENTS.md. Согласуется с задачей
[ansible-inventory-hostvars](ansible-inventory-hostvars.md) (host-специфику в
`host_vars/server.yml`, хост в именованную группу) — логично делать вместе.
Связано: production.yml, timeweb.yml, tasks.py, AGENTS.md,
docs/drafts/timeweb-migration-log.md, ansible-inventory-hostvars.
+1 -3
View File
@@ -2,8 +2,6 @@
ungrouped:
hosts:
server:
ansible_host: "158.160.46.255"
ansible_host: "92.53.105.41"
ansible_user: "major"
ansible_become: true
application_dir: "/mnt/applications"
mount_external_storage: true
+1 -1
View File
@@ -9,7 +9,7 @@ from invoke.context import Context
from invoke.exceptions import Exit
from invoke.tasks import task
HOSTS_FILE = "timeweb.yml"
HOSTS_FILE = "production.yml"
VARS_FILE = "group_vars/all/main.yml"
AUTHELIA_DOCKER = "docker run --rm -v $PWD:/data authelia/authelia:4.39.4 authelia"
-7
View File
@@ -1,7 +0,0 @@
---
ungrouped:
hosts:
server:
ansible_host: "92.53.105.41"
ansible_user: "major"
ansible_become: true