Модуль ios_command отправляет команду show на устройство под управлением IOS и возвращает результат выполнения команды.
Модуль ios_command не поддерживает отправку команд в конфигурационном режиме. Для этого используется отдельный модуль - ios_config.
Модуль ios_command поддерживает такие параметры:
Перед отправкой самой команды модуль:
terminal length 0
, чтобы вывод команд show отражался полностью, а не постраничноterminal width 512
Пример использования модуля ios_command (playbook 1_ios_command.yml):
--- - name: Run show commands on routers hosts: cisco-routers tasks: - name: run sh ip int br ios_command: commands: show ip int br register: sh_ip_int_br_result - name: Debug registered var debug: var=sh_ip_int_br_result.stdout_lines
Модуль ios_command ожидает, как минимум, такие аргументы:
Обратите внимание, что параметр register находится на одном уровне с именем задачи и модулем, а не на уровне параметров модуля ios_command.
Результат выполнения playbook:
$ ansible-playbook 1_ios_command.yml
В отличие от использования модуля raw, playbook не указывает, что были выполнены изменения.
Модуль ios_command позволяет выполнять несколько команд.
Playbook 2_ios_command.yml выполняет несколько команд и получает их вывод:
--- - name: Run show commands on routers hosts: cisco-routers tasks: - name: run show commands ios_command: commands: - show ip int br - sh ip route register: show_result - name: Debug registered var debug: var=show_result.stdout_lines
В первой задаче указываются две команды, поэтому синтаксис должен быть немного другим - команды должны быть указаны как список, в формате YAML.
Результат выполнения playbook (вывод сокращен):
$ ansible-playbook 2_ios_command.yml
Обе команды выполнились на всех устройствах.
Если модулю передаются несколько команд, результат выполнения команд находится в переменных stdout и stdout_lines в списке. Вывод будет в том порядке, в котором команды описаны в задаче.
За счет этого, например, можно вывести результат выполнения первой команды, указав:
- name: Debug registered var debug: var=show_result.stdout_lines[0]
В модуле встроено распознание ошибок. Поэтому, если команда выполнена с ошибкой, модуль отобразит, что возникла ошибка.
Например, если сделать ошибку в команде и запустить playbook еще раз
$ ansible-playbook 2_ios_command.yml
Ansible обнаружил ошибку и возвращает сообщение ошибки. В данном случае - 'Invalid input'.
Аналогичным образом модуль обнаруживает ошибки:
Параметр wait_for (или waitfor) позволяет указывать список условий, на которые надо проверить вывод команды.
Пример playbook (файл 3_ios_command_wait_for.yml):
--- - name: Run show commands on routers hosts: cisco-routers tasks: - name: run show commands ios_command: commands: ping 192.168.100.100 wait_for: - result[0] contains 'Success rate is 100 percent'
В playbook всего одна задача, которая отправляет команду ping 192.168.100.100, и проверяет, есть ли в выводе команды фраза 'Success rate is 100 percent'.
Если в выводе команды содержится эта фраза, задача считается корректно выполненной.
Запуск playbook:
$ ansible-playbook 3_ios_command_wait_for.yml -v
Если указан IP-адрес, который не доступен, результат будет таким:
$ ansible-playbook 3_ios_command_wait_for.yml -v
Такой вывод из-за того, что по умолчанию таймаут для каждого пакета 2 секунды, и за время выполнения playbook команда еще не выполнена.
По умолчанию есть 10 попыток выполнить команду, при этом между каждыми двумя попытками интервал - секунда. В реальной ситуации при проверке доступности адреса лучше сделать хотя бы две попытки.
Playbook 3_ios_command_wait_for_interval.yml выполняет две попытки, на каждую попытку 12 секунд:
--- - name: Run show commands on routers hosts: cisco-routers tasks: - name: run show commands ios_command: commands: ping 192.168.100.5 timeout 1 wait_for: - result[0] contains 'Success rate is 100 percent' retries: 2 interval: 12
В этом случае вывод будет таким:
$ ansible-playbook 3_ios_command_wait_for_interval.yml