← Все новости

Ansible 2.22 маскирует секреты автоматически — и ломает привычные проверки в логахAnsible 2.22 masks secrets automatically, and breaks the log checks you may rely on

В ansible-core 2.22 появилось автоматическое скрытие секретов: значения из vault, no_log, пароли подключений и ввод prompt попадают в вывод как $REDACTED$. Заодно исчезли старые заглушки вроде VALUE_SPECIFIED_IN_NO_LOG_PARAMETER, на которые часто опираются тесты.ansible-core 2.22 adds automatic secret masking: vault values, no_log options, connection passwords and prompt input appear as $REDACTED$ in output. At the same time the old placeholders such as VALUE_SPECIFIED_IN_NO_LOG_PARAMETER are gone, which breaks tests that rely on them.

2 ноября вышел ansible-core 2.22, и главное в нём — не новые модули, а переработанная работа с секретами. Раньше защита строилась на двух вещах: no_log, который прятал вывод модуля, и эвристики, которые вырезали из строк что-то похожее на пароль. Обе подходили к задаче грубо: no_log ломал дальнейшее использование значения в задачах, а эвристики могли и не заметить секрет, и испортить полезные данные.

Теперь в Ansible есть реестр секретов. Значения регистрируются, а затем заменяются на $REDACTED$ в выводе display, в предупреждениях и ошибках, в логах модулей и в результатах, которые получают callback-плагины. Маскирование неразрушающее: задача, условие или зарегистрированная переменная по-прежнему видят настоящее значение, скрывается только отрендеренный текст.

Автоматически регистрируются пароли vault (из промпта, файла или скрипта), расшифрованные значения, пароли --ask-pass и --ask-become-pass, значения опций с no_log, пароли become-плагинов, private_key и private_key_passphrase у ssh, пароли winrm и psrp, значения lookups password и unvault, ввод pause без эха и приватный vars_prompt. Появился публичный API ansible.module_utils.secrets с register_secret() и mask_secrets(), а для C# — аналог Ansible.Secrets.

Что сломается

Порт-гайд перечисляет изменения, которые заденут существующие плейбуки. no_log больше не подставляет литерал VALUE_SPECIFIED_IN_NO_LOG_PARAMETER в результат и invocation.module_args — вместо этого значение регистрируется как секрет и скрывается только в выводе, поэтому тесты, которые ищут эту строку, надо править. run_command() больше не заменяет пароли в аргументах на звёздочки и не прогоняет сообщения через heuristic_log_sanitize(). Сырой stdout команд больше не печатается на повышенной подробности. Ключ invocation в результатах Python- и PowerShell-модулей по умолчанию отсутствует.

Плюс изменения платформы: добавлена поддержка Python 3.15 и убрана поддержка Python 3.12 на контроллере. Если контроллер ещё на 3.12, обновление придётся отложить или сначала перевести сам контроллер.

ansible-core 2.22 shipped on 2 November, and its headline is not new modules but reworked secret handling. Protection used to rest on two things: no_log, which hid module output, and heuristics that stripped password-like strings. Both were blunt: no_log broke later use of the value in tasks, while heuristics could miss a secret or mangle useful data.

Ansible now keeps a registry of secrets. Values are registered and then replaced with $REDACTED$ in display output, warnings and errors, module logs, and results passed to callback plugins. Masking is non-destructive: tasks, conditionals and registered variables still see the real value, and only the rendered text is redacted.

Registered automatically are vault passwords (from a prompt, file or script), decrypted values, --ask-pass and --ask-become-pass passwords, no_log option values, become-plugin passwords, ssh private_key and private_key_passphrase, winrm and psrp passwords, the password and unvault lookups, pause input when echo is off, and private vars_prompt entries. There is a public ansible.module_utils.secrets API with register_secret() and mask_secrets(), plus a C# equivalent.

What breaks

The porting guide lists changes that will affect existing playbooks. no_log no longer substitutes the literal VALUE_SPECIFIED_IN_NO_LOG_PARAMETER in results and invocation.module_args; the value is registered as a secret and redacted only in output, so tests looking for that string must change. run_command() no longer rewrites passwords in arguments to asterisks or runs messages through heuristic_log_sanitize(). Raw command stdout is no longer printed at higher verbosity. The invocation key is absent from Python and PowerShell module results by default.

Platform changes too: Python 3.15 is supported and Python 3.12 is dropped on the controller. If your controller still runs 3.12, either postpone the upgrade or move the controller first.

Источники