Книга: PyNEng
Назад: 24. Сетевые модули
Дальше: ios_facts

ios_command

Модуль ios_command

Модуль ios_command отправляет команду show на устройство под управлением IOS и возвращает результат выполнения команды.

Модуль ios_command не поддерживает отправку команд в конфигурационном режиме. Для этого используется отдельный модуль - ios_config.

Модуль ios_command поддерживает такие параметры:

  • commands - список команд, которые надо отправить на устройство
  • wait_for (или waitfor) - список условий, на которые надо проверить вывод команды. Задача ожидает выполнения всех условий. Если после указанного количества попыток выполнения команды условия не выполняются, будет считаться, что задача выполнена неудачно.
  • match - этот параметр используется вместе с wait_for для указания политики совпадения. Если параметр match установлен в all, должны выполниться все условия в wait_for. Если параметр равен any, достаточно, чтобы выполнилось одно из условий.
  • retries - указывает количество попыток выполнения команды, прежде чем она будет считаться невыполненной. По умолчанию - 10 попыток.
  • interval - интервал в секундах между повторными попытками выполнить команду. По умолчанию - 1 секунда.

Перед отправкой самой команды модуль:

  • выполняет аутентификацию по SSH
  • переходит в режим enable
  • выполняет команду 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 ожидает, как минимум, такие аргументы:

  • commands - список команд, которые нужно отправить на устройство

Обратите внимание, что параметр 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'.

Аналогичным образом модуль обнаруживает ошибки:

  • Ambiguous command
  • Incomplete command

wait_for

Параметр 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 

Назад: 24. Сетевые модули
Дальше: ios_facts