Как использовать условие «когда» в ansible для фильтрации вывода - PullRequest
0 голосов
/ 07 апреля 2020

Так что я только начал использовать 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

1 Ответ

0 голосов
/ 07 апреля 2020

Попробуйте тестовые строки

    - debug:
        msg: "{{ inventory_hostname }} does not support SSH !"
      when: result.stdout is not search('SSH Enabled')
...