Ansible: общие переменные перенесены в group_vars/all

- 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 инвентаря теперь имеют приоритет над общими переменными
This commit is contained in:
av
2026-07-24 20:44:51 +03:00
parent cd0d014c99
commit 1cf660b4fd
38 changed files with 7 additions and 143 deletions
+3 -2
View File
@@ -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/<app>/` — 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`.
+1 -1
View File
@@ -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
-1
View File
@@ -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` _(ансибл-ревью)_
-22
View File
@@ -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.
-4
View File
@@ -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 }}"
-2
View File
@@ -3,8 +3,6 @@
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
- files/authelia/secrets.yml
vars:
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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:
-4
View File
@@ -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 }}"
-4
View File
@@ -2,10 +2,6 @@
- name: "Install eget and pinned binaries"
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
# Версии инструментов: https://github.com/<repo>/releases
tasks:
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-2
View File
@@ -4,8 +4,6 @@
gather_facts: false
vars_files:
- vars/secrets.yml
- vars/vars.yml
- vars/homepage.yml
tasks:
-2
View File
@@ -3,8 +3,6 @@
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
- vars/homepage.yml
tasks:
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -2,10 +2,6 @@
- name: "Update and upgrade system packages"
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
vars:
user_name: "<put-name-here>"
-4
View File
@@ -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 }}"
-4
View File
@@ -2,10 +2,6 @@
- name: "Configure base system parameters"
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
vars:
apt_packages:
- acl
-2
View File
@@ -4,8 +4,6 @@
gather_facts: false
vars_files:
- vars/secrets.yml
- vars/vars.yml
- vars/transcriber.yml
- vars/transcriber.images.yml
-2
View File
@@ -3,8 +3,6 @@
hosts: all
vars_files:
- vars/secrets.yml
- vars/vars.yml
- vars/transcriber.yml
- vars/transcriber.images.yml
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
-4
View File
@@ -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:
-4
View File
@@ -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:
-4
View File
@@ -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 }}"
-4
View File
@@ -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 }}"
+3 -3
View File
@@ -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}")