tasks.py: версия authelia CLI берётся из docker-compose
Linting / YAML Lint (push) Waiting to run
Linting / Ansible Lint (push) Waiting to run

- константа AUTHELIA_DOCKER была прибита к 4.39.4, а сервис уже на 4.39.20 — конфиг валидировался чужим бинарником
- authelia-validate-config сам создаёт temp/: директория в .gitignore, на свежем клоне задача падала
This commit is contained in:
av
2026-08-06 10:39:02 +03:00
parent 045b2426b3
commit aeddc1f168
+21 -5
View File
@@ -2,6 +2,7 @@
"""Invoke tasks — замена Taskfile.yml""" """Invoke tasks — замена Taskfile.yml"""
import os import os
import re
import subprocess import subprocess
import sys import sys
@@ -11,7 +12,7 @@ from invoke.tasks import task
HOSTS_FILE = "production.yml" HOSTS_FILE = "production.yml"
VARS_FILE = "group_vars/all/main.yml" VARS_FILE = "group_vars/all/main.yml"
AUTHELIA_DOCKER = "docker run --rm -v $PWD:/data authelia/authelia:4.39.4 authelia" AUTHELIA_COMPOSE_FILE = "files/authelia/docker-compose.template.yml"
# --- Базовый набор: единый интерфейс команд во всех репозиториях --- # --- Базовый набор: единый интерфейс команд во всех репозиториях ---
@@ -33,6 +34,17 @@ def _remote_host() -> str:
return _yq(".ungrouped.hosts.server.ansible_host") return _yq(".ungrouped.hosts.server.ansible_host")
def _authelia_docker() -> str:
"""Команда запуска authelia CLI на том же образе, что и задеплоенный сервис"""
pattern = re.compile(r"""image:\s*["']?(\S*authelia/authelia:[^"'\s]+)""")
with open(AUTHELIA_COMPOSE_FILE, encoding="utf-8") as compose:
for line in compose:
match = pattern.search(line)
if match:
return f"docker run --rm -v $PWD:/data {match.group(1)} authelia"
raise Exit(f"Образ authelia не найден в {AUTHELIA_COMPOSE_FILE}", code=1)
def _rest_args() -> list[str]: def _rest_args() -> list[str]:
"""Возвращает аргументы после '--' из sys.argv""" """Возвращает аргументы после '--' из sys.argv"""
try: try:
@@ -247,13 +259,15 @@ def login_as_app(ctx: Context, app: str) -> None:
@task @task
def authelia_cli(ctx: Context, args: str = "") -> None: def authelia_cli(ctx: Context, args: str = "") -> None:
"""Запустить authelia CLI в docker""" """Запустить authelia CLI в docker"""
ctx.run(f"{AUTHELIA_DOCKER} {args}") ctx.run(f"{_authelia_docker()} {args}")
@task @task
def authelia_validate_config(ctx: Context) -> None: def authelia_validate_config(ctx: Context) -> None:
"""Отрендерить конфиг authelia из шаблона и проверить его""" """Отрендерить конфиг authelia из шаблона и проверить его"""
dest = "temp/configuration.yml" dest = "temp/configuration.yml"
# temp/ в .gitignore, на свежем клоне его нет — ansible сам директорию не создаёт.
os.makedirs(os.path.dirname(dest), exist_ok=True)
try: try:
ctx.run( ctx.run(
"uv run ansible localhost" "uv run ansible localhost"
@@ -262,7 +276,7 @@ def authelia_validate_config(ctx: Context) -> None:
" --extra-vars @group_vars/all/secrets.yml" " --extra-vars @group_vars/all/secrets.yml"
" --extra-vars @files/authelia/secrets.yml" " --extra-vars @files/authelia/secrets.yml"
) )
ctx.run(f"{AUTHELIA_DOCKER} validate-config --config /data/{dest}") ctx.run(f"{_authelia_docker()} validate-config --config /data/{dest}")
finally: finally:
ctx.run(f"rm -f {dest}", warn=True) ctx.run(f"rm -f {dest}", warn=True)
@@ -270,14 +284,16 @@ def authelia_validate_config(ctx: Context) -> None:
@task @task
def authelia_gen_random_string(ctx: Context, length: int = 10) -> None: def authelia_gen_random_string(ctx: Context, length: int = 10) -> None:
"""Сгенерировать случайную alphanumeric-строку""" """Сгенерировать случайную alphanumeric-строку"""
ctx.run(f"{AUTHELIA_DOCKER} crypto rand --length {length} --charset alphanumeric") ctx.run(
f"{_authelia_docker()} crypto rand --length {length} --charset alphanumeric"
)
@task @task
def authelia_gen_secret_and_hash(ctx: Context, length: int = 72) -> None: def authelia_gen_secret_and_hash(ctx: Context, length: int = 72) -> None:
"""Сгенерировать случайный секрет и его pbkdf2-sha512 хэш""" """Сгенерировать случайный секрет и его pbkdf2-sha512 хэш"""
ctx.run( ctx.run(
f"{AUTHELIA_DOCKER} crypto hash generate pbkdf2" f"{_authelia_docker()} crypto hash generate pbkdf2"
f" --variant sha512 --random --random.length {length} --random.charset rfc3986" f" --variant sha512 --random --random.length {length} --random.charset rfc3986"
) )