diff --git a/tasks.py b/tasks.py index 3cf4830..2bf5ee9 100644 --- a/tasks.py +++ b/tasks.py @@ -112,7 +112,16 @@ def decrypt(ctx: Context, file: str) -> None: @task(aliases=["ee"]) def edit_encrypted(ctx: Context, path: str) -> None: """Редактировать vault-файл через ansible-vault edit (без расшифровки на диск)""" - ctx.run(f"uv run ansible-vault edit {path}", pty=True) + # Намеренно не через ctx.run: invoke заводит свой pty, а внешний терминал + # переводит лишь в cbreak — ixon остаётся включённым, и Ctrl+S/Ctrl+Q съедает + # драйвер терминала как XOFF/XON, до редактора они не доходят. subprocess + # отдаёт редактору настоящий tty, и его raw-режим гасит ixon сам. + result = subprocess.run(["uv", "run", "ansible-vault", "edit", path]) + if result.returncode != 0: + raise Exit( + f"ansible-vault edit: код возврата {result.returncode}", + code=result.returncode, + ) # --- Синхронизация общих ролей с каноном ansible-roles ---