expect#
Некоторые команды требуют от пользователя ввода данных, то есть являются интерактивными.
Модуль ansible.builtin.expect запускает процесс, который перехватывает запросы (prompts) интерактивных команд.
Он сопоставляет тексты запросов с шаблонами, указанными в параметре responses, и отправляет соответствующие ответы.
Особенности работы#
Особенности использования модуля ansible.builtin.expect:
Для работы модуля на управляемом узле должно быть установлено следующее ПО:
интерпретатор Python версии 2.6 или более новый;
библиотека
pexpectверсии не ниже 3.3.
Модуль предназначен для простых сценариев. Для более сложных задач используйте утилиту
expectс модулями ansible.builtin.shell или ansible.builtin.script. Пример использования утилиты см. в документации модуляansible.builtin.shell.Если команда возвращает данные в кодировке, отличной от UTF-8, закодируйте их, чтобы избежать проблем с обработкой. Один из вариантов – закодировать вывод в формат
base64.
Параметры#
Модуль принимает следующие параметры:
- chdir#
Каталог, в который нужно перейти перед запуском команды.
- command#
Обязательный параметр.
Команда, которую необходимо выполнить.
Примечание
Команда не обрабатывается оболочкой. Символы вроде
<,|,&не будут работать, если явно не вызвать оболочку, например:command: /bin/bash -c "echo hello | grep h"
- creates#
Путь к файлу. Если указанный файл существует, вся задача будет пропущена – команда не будет запущена. Это позволяет избежать повторного запуска команд, не предназначенных для многократного выполнения, например, установочных скриптов, создающих определенные файлы.
- echo#
Отображение ответов (из
responses) в выводе.Возможные значения:
false– не отображать ответы в выводе;true– отображать ответы в выводе.
Значение по умолчанию:
false.
- removes#
Путь к файлу. Если указанный файл не существует, вся задача будет пропущена – команда не будет запущена. Это позволяет избежать повторного запуска команд, зависящих от существования определенного файла, например, скриптов очистки, удаляющих артефакты предыдущих запусков.
- responses#
Обязательный параметр.
Словарь с сопоставлением шаблонов запросов (вопросов) и соответствующих ответов.
Ключами являются регулярные выражения Python, соответствующие тексту запроса. Чтобы игнорировать регистр, добавьте в регулярное выражение модификатор
i, например,(?i)password:. Подробную информацию о синтаксисе регулярных выражений см. в документации Python.Значение может быть строкой или списком строк:
если указана строка, она будет использоваться при каждом совпадении шаблона;
если указан список, каждый последующий ответ будет отправляться при следующем совпадении (по порядку).
Примечание
Библиотека
pexpect, используемая этим модулем, работает с окном поиска размером 2000 байт и не поддерживает многострочное сопоставление с регулярным выражением. Чтобы выполнить сопоставление с началом строки, используйте шаблон вида (?m^pattern).
- timeout#
Максимальное время (в секундах), в течение которого модуль ожидает появления строки, совпадающей с одним из шаблонов в
responses. Если в течение этого времени запрос не появляется, задача завершается с ошибкой. Чтобы отключить ожидание, установите значениеnull.Значение по умолчанию:
30.
Атрибуты#
Атрибуты определяют функции Ansible, которые может использовать модуль.
Атрибут |
Описание |
|---|---|
|
Модуль не поддерживает режим проверки ( |
|
Модуль не поддерживает режим сравнения ( |
|
Модуль поддерживает только POSIX-совместимые ОС. |
Примеры#
Для изучения возможностей модуля ознакомьтесь с приведенными ниже примерами.
Импорт базы данных с интерактивным паролем#
Следующий пример демонстрирует использование модуля ansible.builtin.expect для автоматизации восстановления базы данных, когда команда mysql запрашивает пароль во время выполнения:
---
# ...
vars:
mysql_root_pass: supersecretpassword
tasks:
- name: Import database with password prompt
ansible.builtin.expect:
command: /bin/bash -c "mysql -u root -p mydatabase < dump.sql"
responses:
'Enter password:': "{{ mysql_root_pass }}"
no_log: true
Взаимодействие с интерактивным установщиком ПО#
Следующий пример демонстрирует автоматизацию установки программного обеспечения с помощью модуля ansible.builtin.expect:
---
# ...
tasks:
- name: Installing software with an interactive installer
ansible.builtin.expect:
command: ./install_app.sh
responses:
'Do you accept the terms? (yes/no)': 'yes'
'Install location \[.*\]:': '/opt/app'
'Would you like to start the app? (y/n)': 'y'
Настройка сетевого оборудования#
Следующий пример демонстрирует, как с помощью модуля ansible.builtin.expect отправлять команды и подтверждения на сетевое устройство, не поддерживающее API, при подключении по SSH:
---
# ...
vars:
router_pass: s3cr3t
tasks:
- name: Save running configuration on a Cisco router
ansible.builtin.expect:
command: "ssh admin@{{ inventory_hostname }}"
responses:
'Password:': "{{ router_pass }}"
'Router#': 'write memory'
'Destination filename': '\n'
'\[OK\]': '\n'
no_log: true