Как обнаружить недостижимые целевые хосты в ansible

#ssh #ansible #runtime-error #host

#ssh #ansible #ошибка во время выполнения #хост

Вопрос:

Я хочу захватить переменную, sshreachable если целевые хосты all_hosts достижимы или нет.

Я написал приведенный ниже сборник для того же.

 - name: Play 3- check telnet nodes
  hosts: localhost
  ignore_unreachable: yes


   - name: Check all port numbers are accessible from current host
     include_tasks: innertelnet.yml
     with_items: "{{ groups['all_hosts'] }}"
  

cat innertelnet.yml

 ---

       - name: Check ssh connectivity
         block:

           - raw: "ssh -o BatchMode=yes root@{{ item }} echo success"
             ignore_errors: yes
             register: sshcheck

           - debug:
               msg: "SSHCHECK variable:{{ sshcheck }}"

           - set_fact:
               sshreachable: 'SSH SUCCESS'
             when: sshcheck.unreachable == 'false'
           - set_fact:
               sshreachable: 'SSH FAILED'
             when: sshcheck.unreachable == 'true'

       - debug:
           msg: "INNERSSH1: {{ sshreachable }}"
  

К сожалению, я получаю ошибку, подобную приведенной ниже:

Вывод:

 TASK [raw] *********************************************************************
    fatal: [localhost]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Shared connection to 10.9.9.126 closed.", "skip_reason": "Host localhost is unreachable", "unreachable": true}
    
        TASK [debug] ***********************************************************************************************************************************************************
        task path:

    ok: [localhost] => {
        "msg": "SSHCHECK variable:{'msg': u'Failed to connect to the host via ssh: Shared connection to 10.9.9.126 closed.', 'unreachable': True, 'changed': False}"
    }

TASK [set_fact] ****************************************************************
skipping: [localhost]

TASK [set_fact] ****************************************************************
skipping: [localhost]

TASK [debug] *******************************************************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'sshreachable' is undefinednnThe error appears to be in '/app/playbook/checkssh/innertelnet.yml': line 45, column 10, but maynbe elsewhere in the file depending on the exact syntax problem.nnThe offending line appears to be:nnn       - debug:n         ^ heren"}

PLAY RECAP *********************************************************************
10.0.116.194                : ok=101  changed=1    unreachable=9    failed=0    skipped=12   rescued=0    ignored=95  
localhost          : ok=5    changed=0    unreachable=1    failed=1    skipped=4    rescued=0    ignored=0  
  

Не могли бы вы предложить изменения в моем коде, чтобы заставить это работать?

Комментарии:

1. в вашей логике есть недостатки. у sshcheck переменной нет атрибутов unreachable или reachable для принятия решения по ней. добавьте задачу отладки для проверки переменной при выполнении raw команды успешно или неудачно, и вы подтвердите это. Затем вы сможете решить, какие поля использовать для определения того, работает ли хост вверх или вниз, если вы все еще хотите продолжить работу с вашим текущим кодом.

2. я не работал над подобной проблемой, чтобы дать вам четкий ответ. я бы, вероятно, рассмотрел возможность использования wait_for задачи с delegate_to циклическим подключением локального хоста для всех серверов, которые вы хотите, и службы, которую вы ожидаете запустить (ssh / telnet). однако, чтобы исправить логику вашего кода, мне кажется, вы могли бы принять решение о том, что сервер не работает, когда sshreachable значение не определено.

3. На самом деле мне интересно, нужен ли вам модуль wait_for_connection , который я часто использую, чтобы проверить, доступен ли хост (например, ожидая запуска экземпляра cloud), прежде чем пытаться запускать с ним задачи.

4. Я добавил отладку и поделился выводом в своем первоначальном обновлении сообщения Дорогой @ilias-sp

5. Мне это нужно для ведения журнала. Было ли подключение ssh целевого сервера с сервера Ansible успешным или неудачным в момент запуска автоматизации. @larsk

Ответ №1:

Ошибка, по-видимому, указывает на то, что sshreachable переменная не устанавливается, поскольку when: условие не соответствует. Т.е. sshcheck.unreachable может быть не что-то возвращенное raw .

Для этой цели должно быть достаточно command модуля, и мы можем оценить код возврата команды на set_fact .

Вы могли бы сделать что-то вроде:

 - block:
  - command: ssh -o BatchMode=yes user@host1 echo success
    ignore_errors: yes
    register: sshcheck
  - set_fact:
      sshreachable: "{{ sshcheck is success }}"

- debug:
    msg: "Host1 reachable: {{ sshreachable | string }}"
  

Обновить:

raw модуль, похоже, работает таким же образом. Пример (включая ценный вклад @mdaniel):

 - block:
  - raw: ssh -o BatchMode=yes user@host1 echo success
    ignore_errors: yes
    register: sshcheck
  - set_fact:
      sshreachable: SSH SUCCESS
    when: sshcheck is success
  - set_fact:
      sshreachable: SSH FAILED
    when: sshcheck is failed

- debug:
    msg: "Host1 reachable: {{ sshreachable }}"

  

Комментарии:

1. when: sshcheck is failed (и его is success друг) является предпочтительным синтаксисом для этого, также сокращенным как - set_fact: sshreachable: "{{ sshcheck is success }}"

2. @mdaniel Seshadri_C оба ваших решения работают!! но только с command модулем, который зависит от python на целевом хосте. Любое решение, чтобы заставить это работать с raw модулем, пожалуйста, т. е. без зависимости от python??

3. @Ashar Я верю, что raw работает таким же образом. Я обновлю ответ. @mdaniel — спасибо за хороший совет!

4. Решение, которое работает с raw модулем, не ВЫПОЛНЕНО -> when: ssh is unreachable УСПЕШНО -> when: not ssh is unreachable

5. В этом случае raw модуль @Seshadri_C работает иначе, чем command модуль!! Пожалуйста, протестируйте и поделитесь своим опытом.