Работа с выводом команд и приглашениями в сетевых модулях
Условные выражения в сетевых модулях
Ansible позволяет использовать условные выражения для управления ходом выполнения плейбуков. Модули Ansible для выполнения сетевых команд используют следующие специальные условные выражения.
-
eq- Равно -
neq- Не равно -
gt- Больше чем -
ge- Больше или равно -
lt- Меньше чем -
le- Меньше или равно -
contains- Объект содержит указанный элемент
Условные выражения проверяют результаты команд, выполняемых на удалённом устройстве. После выполнения набора команд задачей аргумент wait_for можно использовать для проверки результатов до возврата управления плейбуку Ansible.
Например:
---
- name: wait for interface to be admin enabled
arista.eos.eos_command:
commands:
- show interface Ethernet4 | json
wait_for:
- "result[0].interfaces.Ethernet4.interfaceStatus eq connected"
В приведённой выше задаче команда show interface Ethernet4 | json выполняется на удалённом устройстве, а её результаты проверяются. Если путь (result[0].interfaces.Ethernet4.interfaceStatus) не равен «connected», команда выполняется повторно. Этот процесс продолжается, пока условие не будет выполнено или не истечёт число попыток (по умолчанию — 10 попыток с интервалом в 1 секунду).
Модуль commands также может проверять несколько наборов результатов команд в интерфейсе. Например:
---
- name: wait for interfaces to be admin enabled
arista.eos.eos_command:
commands:
- show interface Ethernet4 | json
- show interface Ethernet5 | json
wait_for:
- "result[0].interfaces.Ethernet4.interfaceStatus eq connected"
- "result[1].interfaces.Ethernet5.interfaceStatus eq connected"
В приведённом выше примере на удалённом устройстве выполняются две команды, а их результаты проверяются. Если указать индекс результата (0 или 1), нужный результат будет проверен на соответствие условию.
Аргумент wait_for всегда должен начинаться со слова result, за которым следует индекс команды в [], где 0 — первая команда в списке команд, 1 — вторая команда, 2 — третья и так далее.
Обработка приглашений в сетевых модулях
Перед внесением изменений на сетевом устройстве может потребоваться ответить на приглашение. Отдельные сетевые модули, например cisco.ios.ios_command и cisco.nxos.nxos_command, могут обрабатывать такие приглашения с помощью параметра prompt.
Примечание
prompt — это регулярное выражение Python. Если добавить специальные символы, например ?, в значение prompt, приглашение не совпадёт с шаблоном, и произойдёт превышение времени ожидания. Чтобы этого избежать, убедитесь, что значение prompt — это регулярное выражение Python, соответствующее фактическому приглашению устройства. Все специальные символы необходимо корректно обработать в регулярном выражении prompt.
Для обработки нескольких приглашений также можно использовать ansible.netcommon.cli_command.
---
- name: multiple prompt, multiple answer (mandatory check for all prompts)
ansible.netcommon.cli_command:
command: "copy sftp sftp://user@host//user/test.img"
check_all: True
prompt:
- "Confirm download operation"
- "Password"
- "Do you want to change that to the standby image"
answer:
- 'y'
- <password>
- 'y'
Перечислите приглашения и ответы в одном и том же порядке (то есть на prompt[0] отвечает answer[0]).
В приведённом выше примере check_all: True гарантирует, что задача выдаст соответствующий ответ на каждое приглашение. Без этой настройки задача с несколькими приглашениями выдавала бы первый ответ на каждое из них.
В следующем примере второй ответ будет проигнорирован, а y будет выдан в ответ на оба приглашения. Таким образом, эта задача работает только потому, что оба ответа одинаковы. Обратите также внимание, что prompt должно быть регулярным выражением Python, поэтому символ ? экранирован в первом приглашении.
---
- name: reboot ios device
ansible.netcommon.cli_command:
command: reload
prompt:
- Save\?
- confirm
answer:
- y
- y
См. также
- Перезагрузка сетевых устройств с помощью Ansible
-
Примеры использования
wait_for,wait_for_connectionиpromptдля сетевых устройств. - Подробный разбор cli_command
-
Подробный обзор использования
cli_command.
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/network/user_guide/network_working_with_command_output.html