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, которые может использовать модуль.

Атрибут

Описание

check_mode

Модуль не поддерживает режим проверки (check_mode).

diff_mode

Модуль не поддерживает режим сравнения (diff_mode).

platform

Модуль поддерживает только 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