Так что я только начал использовать Ansible менее чем за неделю. Я попытался и прочитал несколько сообщений о том, как фильтровать вывод. Тем не менее, ни один, кажется, не работает. Я использую Ansible версию: ansible 2.9.6 и python версию = 2.7.12. См. Мой образец книги ниже
#This playbook checks if a Cisco Router supports SSH using Telnet
- name: Checking If Cisco device Supports SSH
hosts: all
gather_facts: False
tasks:
- name: Telnet to Device
telnet:
login_prompt: ": "
prompts:
- '[>#]'
command:
- show ip ssh | include SSH
register: result
- name: Second Task
debug:
msg: "{{inventory_hostname}} does not support SSH !"
when: not(result.stdout.find('SSH Enabled') != -1)
Ожидаемый результат: Ansible выполнит поиск в выходных данных маршрутизатора и выполнит поиск несуществующей строки "S SH Enabled" в result.stdout как cisco IOS и вернет "Invalid input", если он не поддерживает эту команду. Книга воспроизведения должна быть запущена на всех устройствах, и у меня есть другая книга воспроизведения, чтобы включить S SH на всех них. Смотрите вывод ниже, когда я исполняю эту пьесу.
PLAYBOOK: CheckSSH.yml *************************************************************************************************************************************************************************************
1 plays in CheckSSH.yml
PLAY [Checking If Cisco device Supports SSH] ***************************************************************************************************************************************************************
META: ran handlers
TASK [Telnet to Device] ************************************************************************************************************************************************************************************
task path: /../CheckSSH.yml:8
changed: [XXXX_sw] => changed=true
output:
- |-
show ip ssh | include SSH
^
% Invalid input detected at '^' marker.
XXXX_SW#
TASK [Second Task] *****************************************************************************************************************************************************************************************
task path: /.../CheckSSH.yml:17
fatal: [XXXX_sw]: FAILED! =>
msg: 'Invalid options for debug: when'
PLAY RECAP *************************************************************************************************************************************************************************************************
XXXX_sw : ok=1 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Может кто-нибудь объяснить, что происходит. Я только хочу автоматически узнать, поддерживает ли мое устройство S SH. Я намерен запустить эту команду на 200 устройствах. Кроме того, я намерен использовать выходную фильтрацию для запуска диагностики на разных устройствах.
Обновление: я также применил рекомендацию. Смотрите новый код здесь
---
#This playbook checks if a device supports SSH using Telnet
#The device must support telnet first though
- name: Checking If Cisco device Supports SSH
hosts: all
gather_facts: False
tasks:
- name: Telnet to Device
telnet:
login_prompt: ": "
prompts:
- '[>#]'
command:
# - terminal length 0
- show ip ssh | include SSH
register: result
- name: Second Task
debug:
msg: "{{inventory_hostname}} does not support SSH !"
when: result.stdout is not search('SSH Enabled')
Но посмотрите вывод, который я получаю
TASK [Second Task] *****************************************************************************************************************************************************************************************
task path: /etc/ansible/CheckSSH.yml:18
fatal: [xxxx]: FAILED! =>
msg: |-
The conditional check 'result.stdout is not search('SSH Enabled')' failed. The error was: error while evaluating conditional (result.stdout is not search('SSH Enabled')): 'dict object' has no attribute 'stdout'
The error appears to be in '/etc/ansible/CheckSSH.yml': line 18, column 7, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: Second Task
^ here