- Пароль лежит открытым текстом рядом с репозиторием, а `ansible.cfg`
подставляет его в любую ansible-команду — отсюда дамп секретов
через `ansible-inventory --list`.
- Заведена идеей, а не задачей: компромисс «удобство против доступности
автоматизации агенту» не разрешён, варианты с KeePassXC записаны с ценой.
- backup-targets собирается одной copy вместо lineinfile в цикле: теперь
удаление цели из списка реально убирает строку из файла (7 плейбуков)
- netdata: getent вместо grep по /etc/group, ушёл бессмысленный changed_when
и мёртвый фолбэк PGID
- исправлены копипастные имена play в wanderer и remove-user-and-app
- production.yml переписан на живой Timeweb-хост, timeweb.yml удалён,
HOSTS_FILE в tasks.py и примеры в README поправлены
- host-vars application_dir и mount_external_storage не перенесены: это
наследие YC-диска, а после переезда в group_vars инвентарь их перебивает
- ansible.cfg: inventory по умолчанию, чтобы забытый -i не уводил в никуда
- caddyproxy, netdata, authelia, bifrost, remembos: конфиг-задачи нотифаят
handler "Restart application" вместо безусловного или условного рестарта
- ansible.cfg: force_handlers, иначе упавший прогон теряет notify и рестарт,
применяющий правку конфига, не случится уже никогда
- authelia рестартит только authelia_app, чтобы не сбрасывать сессии в redis
- vars/vars.yml → group_vars/all/main.yml, vars/secrets.yml →
group_vars/all/secrets.yml; boilerplate vars_files убран из всех плейбуков
- имя secrets.yml сохранено намеренно: pre-commit-хук и .crushignore ищут
слово secret(s) в имени файла
- host_vars инвентаря теперь имеют приоритет над общими переменными