diff --git a/tasks.py b/tasks.py index 2bf5ee9..6069e00 100644 --- a/tasks.py +++ b/tasks.py @@ -2,6 +2,7 @@ """Invoke tasks — замена Taskfile.yml""" import os +import re import subprocess import sys @@ -11,7 +12,7 @@ from invoke.tasks import task 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" +AUTHELIA_COMPOSE_FILE = "files/authelia/docker-compose.template.yml" # --- Базовый набор: единый интерфейс команд во всех репозиториях --- @@ -33,6 +34,17 @@ def _remote_host() -> str: 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]: """Возвращает аргументы после '--' из sys.argv""" try: @@ -247,13 +259,15 @@ def login_as_app(ctx: Context, app: str) -> None: @task def authelia_cli(ctx: Context, args: str = "") -> None: """Запустить authelia CLI в docker""" - ctx.run(f"{AUTHELIA_DOCKER} {args}") + ctx.run(f"{_authelia_docker()} {args}") @task def authelia_validate_config(ctx: Context) -> None: """Отрендерить конфиг authelia из шаблона и проверить его""" dest = "temp/configuration.yml" + # temp/ в .gitignore, на свежем клоне его нет — ansible сам директорию не создаёт. + os.makedirs(os.path.dirname(dest), exist_ok=True) try: ctx.run( "uv run ansible localhost" @@ -262,7 +276,7 @@ def authelia_validate_config(ctx: Context) -> None: " --extra-vars @group_vars/all/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: ctx.run(f"rm -f {dest}", warn=True) @@ -270,14 +284,16 @@ def authelia_validate_config(ctx: Context) -> None: @task def authelia_gen_random_string(ctx: Context, length: int = 10) -> None: """Сгенерировать случайную alphanumeric-строку""" - ctx.run(f"{AUTHELIA_DOCKER} crypto rand --length {length} --charset alphanumeric") + ctx.run( + f"{_authelia_docker()} crypto rand --length {length} --charset alphanumeric" + ) @task def authelia_gen_secret_and_hash(ctx: Context, length: int = 72) -> None: """Сгенерировать случайный секрет и его pbkdf2-sha512 хэш""" 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" )