diff --git a/AGENTS.md b/AGENTS.md index d810c2f..6137ff9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,8 @@ Ansible-проект для автоматизации личного серве - `playbook-*.yml` — плейбуки по одному на сервис, `playbook-all-*.yml` для групповых запусков. - `production.yml` — инвентарь с единственным хостом `server`. -- `vars/*.yml` — переменные приложений и образов, `vars/secrets.yml` — зашифрованные секреты (vault). +- `group_vars/all/` — общие переменные для всех хостов: `main.yml` (открытые) и `secrets.yml` (зашифрованные vault). Подхватываются Ansible автоматически, `vars_files` в плейбуках не нужен. Имя `secrets.yml` обязательно: pre-commit-хук и `.crushignore` ищут слово `secret(s)` в имени файла. +- `vars/*.yml` — переменные отдельных приложений (homepage, transcriber), подключаются через `vars_files`. - `roles/` — кастомные роли (`eget`, `owner`, `secrets`), галактические роли в `galaxy.roles/`. - `files//` — docker-compose шаблоны, конфиги, скрипты бэкапов для каждого сервиса. - `templates/` — общие шаблоны (например `env.template`). @@ -98,7 +99,7 @@ uv run ansible-galaxy install --role-file requirements.yml - Суффиксы шаблонов: `.template.yml`, `.template.sh`, `.template.cfg`, `.template.conf`, `.template.toml`, `.template` (для файлов без естественного расширения) — рендерятся Ansible модулем `template`. Расширение оригинального формата сохраняется после `.template.` ради подсветки синтаксиса в редакторе. - Большинство приложений определяют переменные inline в плейбуке. Отдельные файлы переменных только у homepage и transcriber (`vars/homepage.yml`, `vars/transcriber.yml` + `vars/transcriber.images.yml`). -- Общие переменные из `vars/secrets.yml`: `application_dir`, `bin_prefix`, `primary_user` и др. +- Общие переменные из `group_vars/all/` (`main.yml` + vault-файл `secrets.yml`): `application_dir`, `bin_prefix`, `primary_user` и др. Загружаются автоматически для группы `all`, поэтому плейбуки их не перечисляют. Хост-специфичные значения переопределяются в инвентаре — теперь они имеют приоритет над `group_vars`. - Каждое приложение: `app_name`, `app_user`, `app_owner_uid`, `app_owner_gid`, `base_dir`, `data_dir`. - UID/GID сервисов: новое соглашение — диапазон `11xx`, причём `app_owner_uid == app_owner_gid` (одно число на сервис). Новому приложению берём следующий свободный номер по возрастанию. Старые сервисы ещё сидят на легаси-нумерации `10xx` (часто с разными uid/gid) — их не трогаем, но новые заводим только в `11xx`. diff --git a/README.md b/README.md index 7fc2516..a8a12b7 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ uv run ansible-galaxy install --role-file requirements.yml - Безопасность осуществляется с помощью `ufw` и `fail2ban`. - Докер используется для запуска и изоляции приложений. Для загрузки образов настраивается Yandex Docker Registry. - Выход во внешнюю сеть через proxy server [Caddy](https://caddyserver.com/). -- Чувствительные данные в [secrets.yml](vars/secrets.yml) зашифрованы с помощью Ansible Vault. +- Чувствительные данные в [secrets.yml](group_vars/all/secrets.yml) зашифрованы с помощью Ansible Vault. - Для мониторинга за сервером устанавливается [netdata](https://github.com/netdata/netdata). ## Настройка DNS diff --git a/docs/backlog/README.md b/docs/backlog/README.md index 6b7d5e4..1b730ca 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -44,7 +44,6 @@ _(sec-ревью)_ — три независимых security-ревью на м - [Мелкий хардненинг Caddy](caddy-hardening-nits.md) — HSTS-заголовок, убрать лишний `NET_ADMIN`, убрать leftover-листенер `:29999` _(sec-ревью)_ - [Мелкий хардненинг контейнеров](container-hardening-nits.md) — `no-new-privileges`, non-root `user:`, homepage off `:latest`, соглашение о `127.0.0.1:` портах _(sec-ревью)_ - [Унифицировать ACL техпанелей Authelia](authelia-acl-unify.md) — rssbridge (SSRF) и dashboard за `one_factor` без subject; свести к `group:admins` + `two_factor` _(sec-ревью)_ -- [`vars_files` → `group_vars/all/`](ansible-group-vars.md) — убрать повторяющийся boilerplate `vars_files` из всех плейбуков _(ансибл-ревью)_ - [Причесать роль `owner` под конвенции](ansible-owner-role-cleanup.md) — `assert` вместо `fail`+`when`, `loop` вместо `with_*`, добавить `meta`/README _(ансибл-ревью)_ - [Инвентарь: `host_vars`, группы, точечный `become`](ansible-inventory-hostvars.md) — хост-специфику в `host_vars/server.yml`, хост в именованную группу, глобальный root → точечный become _(ансибл-ревью)_ - [Фоновая зачистка стиля и конфигурации](ansible-style-nits.md) — sudoers.d, профиль ansible-lint, `ansible.cfg`, кавычки, `cache_valid_time` _(ансибл-ревью)_ diff --git a/docs/backlog/ansible-group-vars.md b/docs/backlog/ansible-group-vars.md deleted file mode 100644 index 61fd390..0000000 --- a/docs/backlog/ansible-group-vars.md +++ /dev/null @@ -1,22 +0,0 @@ -# `vars_files` → `group_vars/all/` - -**Приоритет:** низкий - -В каждом плейбуке повторяется boilerplate: - -```yaml -vars_files: - - vars/secrets.yml - - vars/vars.yml -``` - -Ansible автоматически подхватывает `group_vars/all.yml` и `group_vars/all/secrets.yml` -(vault) для группы `all`. Перенос `vars/vars.yml` → `group_vars/all/main.yml` и -`vars/secrets.yml` → `group_vars/all/vault.yml` убирает `vars_files` из всех -плейбуков. Низкий риск, адаптируется по одному плейбуку за раз. Учесть -`.crushignore`/проверку шифрования vault (маска `*secrets.yml`) и pre-commit-хук -проверки шифрования при переименовании. - -Контекст: [docs/drafts/ansible-review.md](../drafts/ansible-review.md) §2. - -Связано: все playbook-*.yml, vars/secrets.yml, vars/vars.yml, lefthook.yml. diff --git a/vars/vars.yml b/group_vars/all/main.yml similarity index 100% rename from vars/vars.yml rename to group_vars/all/main.yml diff --git a/vars/secrets.yml b/group_vars/all/secrets.yml similarity index 100% rename from vars/secrets.yml rename to group_vars/all/secrets.yml diff --git a/playbook-apprise.yml b/playbook-apprise.yml index 2e63150..5c67717 100644 --- a/playbook-apprise.yml +++ b/playbook-apprise.yml @@ -2,10 +2,6 @@ - name: "Configure apprise application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "apprise" app_user: "{{ app_name }}" diff --git a/playbook-authelia.yml b/playbook-authelia.yml index 1779900..d5a5d84 100644 --- a/playbook-authelia.yml +++ b/playbook-authelia.yml @@ -3,8 +3,6 @@ hosts: all vars_files: - - vars/secrets.yml - - vars/vars.yml - files/authelia/secrets.yml vars: diff --git a/playbook-backups.yml b/playbook-backups.yml index a5ddd6c..bc2ce3d 100644 --- a/playbook-backups.yml +++ b/playbook-backups.yml @@ -2,10 +2,6 @@ - name: "Configure restic and backup schedule" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: backup_config_dir: "/etc/backup" backup_config_file: "{{ (backup_config_dir, 'config.toml') | path_join }}" diff --git a/playbook-bifrost.yml b/playbook-bifrost.yml index c925396..8f078e3 100644 --- a/playbook-bifrost.yml +++ b/playbook-bifrost.yml @@ -2,10 +2,6 @@ - name: "Configure bifrost application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "bifrost" app_user: "{{ app_name }}" diff --git a/playbook-caddyproxy.yml b/playbook-caddyproxy.yml index 183af31..55ce2df 100644 --- a/playbook-caddyproxy.yml +++ b/playbook-caddyproxy.yml @@ -2,10 +2,6 @@ - name: "Configure caddy reverse proxy service" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "caddyproxy" app_user: "{{ app_name }}" diff --git a/playbook-calibre.yml b/playbook-calibre.yml index 101a5a2..6fadedf 100644 --- a/playbook-calibre.yml +++ b/playbook-calibre.yml @@ -2,10 +2,6 @@ - name: "Configure calibre application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "calibre" app_user: "{{ app_name }}" diff --git a/playbook-dashboard.yml b/playbook-dashboard.yml index bdb5c40..4c9b386 100644 --- a/playbook-dashboard.yml +++ b/playbook-dashboard.yml @@ -2,10 +2,6 @@ - name: "Configure dashboard start page" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "dashboard" app_user: "{{ app_name }}" diff --git a/playbook-docker.yml b/playbook-docker.yml index 8add952..59b8937 100644 --- a/playbook-docker.yml +++ b/playbook-docker.yml @@ -2,10 +2,6 @@ - name: "Configure docker parameters" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - tasks: # - name: "Install python docker lib from pip" # ansible.builtin.pip: diff --git a/playbook-dozzle.yml b/playbook-dozzle.yml index 9d3a391..51962d8 100644 --- a/playbook-dozzle.yml +++ b/playbook-dozzle.yml @@ -2,10 +2,6 @@ - name: "Configure dozzle application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "dozzle" app_user: "{{ app_name }}" diff --git a/playbook-eget.yml b/playbook-eget.yml index a104a0d..3f76645 100644 --- a/playbook-eget.yml +++ b/playbook-eget.yml @@ -2,10 +2,6 @@ - name: "Install eget and pinned binaries" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - # Версии инструментов: https://github.com//releases tasks: diff --git a/playbook-gitea.yml b/playbook-gitea.yml index a2c857e..0892042 100644 --- a/playbook-gitea.yml +++ b/playbook-gitea.yml @@ -2,10 +2,6 @@ - name: "Configure gitea application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "gitea" app_user: "{{ app_name }}" diff --git a/playbook-goaccess.yml b/playbook-goaccess.yml index 1334971..d3876aa 100644 --- a/playbook-goaccess.yml +++ b/playbook-goaccess.yml @@ -2,10 +2,6 @@ - name: "Configure goaccess application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "goaccess" app_user: "{{ app_name }}" diff --git a/playbook-gramps.yml b/playbook-gramps.yml index 79acac6..2e37221 100644 --- a/playbook-gramps.yml +++ b/playbook-gramps.yml @@ -2,10 +2,6 @@ - name: "Configure gramps application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "gramps" app_user: "{{ app_name }}" diff --git a/playbook-homepage-registry.yml b/playbook-homepage-registry.yml index 6131292..eab8eb5 100644 --- a/playbook-homepage-registry.yml +++ b/playbook-homepage-registry.yml @@ -4,8 +4,6 @@ gather_facts: false vars_files: - - vars/secrets.yml - - vars/vars.yml - vars/homepage.yml tasks: diff --git a/playbook-homepage.yml b/playbook-homepage.yml index 6a2040c..2c30094 100644 --- a/playbook-homepage.yml +++ b/playbook-homepage.yml @@ -3,8 +3,6 @@ hosts: all vars_files: - - vars/secrets.yml - - vars/vars.yml - vars/homepage.yml tasks: diff --git a/playbook-memos.yml b/playbook-memos.yml index 54d5ee8..5f028c0 100644 --- a/playbook-memos.yml +++ b/playbook-memos.yml @@ -2,10 +2,6 @@ - name: "Configure memos application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "memos" app_user: "{{ app_name }}" diff --git a/playbook-miniflux.yml b/playbook-miniflux.yml index 2bd1b17..0bb42f1 100644 --- a/playbook-miniflux.yml +++ b/playbook-miniflux.yml @@ -2,10 +2,6 @@ - name: "Configure miniflux application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "miniflux" app_user: "{{ app_name }}" diff --git a/playbook-netdata.yml b/playbook-netdata.yml index b560bda..97db590 100644 --- a/playbook-netdata.yml +++ b/playbook-netdata.yml @@ -2,10 +2,6 @@ - name: "Install Netdata monitoring service" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "netdata" app_user: "{{ app_name }}" diff --git a/playbook-outline.yml b/playbook-outline.yml index 0de6467..015afca 100644 --- a/playbook-outline.yml +++ b/playbook-outline.yml @@ -2,10 +2,6 @@ - name: "Configure outline application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "outline" app_user: "{{ app_name }}" diff --git a/playbook-remembos.yml b/playbook-remembos.yml index 2b46c90..4a62794 100644 --- a/playbook-remembos.yml +++ b/playbook-remembos.yml @@ -2,10 +2,6 @@ - name: "Configure remembos application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "remembos" app_user: "{{ app_name }}" diff --git a/playbook-remove-user-and-app.yml b/playbook-remove-user-and-app.yml index 1de9944..070ee87 100644 --- a/playbook-remove-user-and-app.yml +++ b/playbook-remove-user-and-app.yml @@ -2,10 +2,6 @@ - name: "Update and upgrade system packages" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: user_name: "" diff --git a/playbook-rssbridge.yml b/playbook-rssbridge.yml index 5c8ece2..0497098 100644 --- a/playbook-rssbridge.yml +++ b/playbook-rssbridge.yml @@ -2,10 +2,6 @@ - name: "Configure rssbridge application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "rssbridge" app_user: "{{ app_name }}" diff --git a/playbook-system.yml b/playbook-system.yml index a898afd..9434458 100644 --- a/playbook-system.yml +++ b/playbook-system.yml @@ -2,10 +2,6 @@ - name: "Configure base system parameters" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: apt_packages: - acl diff --git a/playbook-transcriber-registry.yml b/playbook-transcriber-registry.yml index 013585f..9b291ae 100644 --- a/playbook-transcriber-registry.yml +++ b/playbook-transcriber-registry.yml @@ -4,8 +4,6 @@ gather_facts: false vars_files: - - vars/secrets.yml - - vars/vars.yml - vars/transcriber.yml - vars/transcriber.images.yml diff --git a/playbook-transcriber.yml b/playbook-transcriber.yml index 68f694a..f300063 100644 --- a/playbook-transcriber.yml +++ b/playbook-transcriber.yml @@ -3,8 +3,6 @@ hosts: all vars_files: - - vars/secrets.yml - - vars/vars.yml - vars/transcriber.yml - vars/transcriber.images.yml diff --git a/playbook-tududi.yml b/playbook-tududi.yml index f2cf613..78f951a 100644 --- a/playbook-tududi.yml +++ b/playbook-tududi.yml @@ -2,10 +2,6 @@ - name: "Configure tududi application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "tududi" app_user: "{{ app_name }}" diff --git a/playbook-tuwunel.yml b/playbook-tuwunel.yml index 421ac79..f76e6cc 100644 --- a/playbook-tuwunel.yml +++ b/playbook-tuwunel.yml @@ -2,10 +2,6 @@ - name: "Configure tuwunel matrix server" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "tuwunel" app_user: "{{ app_name }}" diff --git a/playbook-ufw.yml b/playbook-ufw.yml index fde99ab..6d10c30 100644 --- a/playbook-ufw.yml +++ b/playbook-ufw.yml @@ -2,10 +2,6 @@ - name: "Configure UFW firewall" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - tasks: - name: "Ensure UFW is installed" ansible.builtin.apt: diff --git a/playbook-upgrade.yml b/playbook-upgrade.yml index 93e7420..7d79389 100644 --- a/playbook-upgrade.yml +++ b/playbook-upgrade.yml @@ -2,10 +2,6 @@ - name: "Update and upgrade system packages" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - tasks: - name: Perform an upgrade of packages ansible.builtin.apt: diff --git a/playbook-wakapi.yml b/playbook-wakapi.yml index aac17b0..278c4f2 100644 --- a/playbook-wakapi.yml +++ b/playbook-wakapi.yml @@ -2,10 +2,6 @@ - name: "Configure wakapi application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "wakapi" app_user: "{{ app_name }}" diff --git a/playbook-wanderer.yml b/playbook-wanderer.yml index 859a710..5e96b32 100644 --- a/playbook-wanderer.yml +++ b/playbook-wanderer.yml @@ -2,10 +2,6 @@ - name: "Configure gramps application" hosts: all - vars_files: - - vars/secrets.yml - - vars/vars.yml - vars: app_name: "wanderer" app_user: "{{ app_name }}" diff --git a/tasks.py b/tasks.py index 83beadc..957c420 100644 --- a/tasks.py +++ b/tasks.py @@ -10,7 +10,7 @@ from invoke.exceptions import Exit from invoke.tasks import task HOSTS_FILE = "timeweb.yml" -VARS_FILE = "vars/vars.yml" +VARS_FILE = "group_vars/all/main.yml" AUTHELIA_DOCKER = "docker run --rm -v $PWD:/data authelia/authelia:4.39.4 authelia" @@ -205,7 +205,7 @@ def roles_push(ctx: Context) -> None: def _application_dir() -> str: - """Чтение application_dir: сначала из inventory (override), затем из vars/vars.yml.""" + """Чтение application_dir: сначала из inventory (override), затем из group_vars.""" inv_value = _yq('.ungrouped.hosts.server.application_dir // ""') if inv_value: return inv_value @@ -250,7 +250,7 @@ def authelia_validate_config(ctx: Context) -> None: "uv run ansible localhost" " --module-name template" f' --args "src=files/authelia/configuration.template.yml dest={dest}"' - " --extra-vars @vars/secrets.yml" + " --extra-vars @group_vars/all/secrets.yml" " --extra-vars @files/authelia/secrets.yml" ) ctx.run(f"{AUTHELIA_DOCKER} validate-config --config /data/{dest}")