1

Мы используем возможность для размещения нескольких узлов в качестве кластера. Машины представляют собой экземпляры, созданные в пользовательской подобной инфраструктуре AWS. У нас есть около ста задач на разных книжках, и они выполняются на каждом узле.Ansible ** спорадически ** терпит неудачу с недоступным хостом - Не удалось подключиться к хосту через ssh

Проблема заключается в том, мы получаем спорадический хост ошибку и выполнение PlayBook прекращается со следующей неудачей:

TASK [common : install basic packages] ************************* 
fatal: [fqdn.for.a.node]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh.", "unreachable": true} 

Выхода с -vvv:

TASK [common : install basic packages] ******************************* 
task path: /jenkins/workspace/Cluster-Deployment/91/roles/common/tasks/install-basic-packages.yml:1 
<fqdn.for.a.node> ESTABLISH SSH CONNECTION FOR USER: root 
<fqdn.for.a.node> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'IdentityFile="id_rsa"' -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o User=root -o ConnectTimeout=600 -o ControlPath=/home/turkenh/.ansible/cp/ansible-ssh-%h-%p-%r fqdn.for.a.node '/bin/sh -c '"'"'(umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `" && echo ansible-tmp-1466523588.96-210828884892875="` echo $HOME/.ansible/tmp/ansible-tmp-1466523588.96-210828884892875 `") && sleep 0'"'"'' 
failed: [fqdn.for.a.node] (item=[u'unzip']) => {"item": ["unzip"], "msg": "Failed to connect to the host via ssh.", "unreachable": true} 

Вот наш файл ansible.cfg :

[defaults] 
forks = 50 
sudo_flags=-i 
nocows=1 

# do not check host key while doing ssh 
host_key_checking = False 
# use openssh not paramiko 
transport = ssh 
private_key_file = id_rsa 
remote_user = root 

Пожалуйста, смотрите наши заметки ниже:

  • Когда мы пытаемся выполнить ping (с помощью несанкционированного модуля ping, а не команды ping shell), этот хост с незаменимым правом после сбоя, он выдает ту же ошибку, но если мы подождем около минуты или около того, мы можем пинговать его.

  • Что мы можем сообщить о нашей пользовательской инфраструктуре, основанной на AWS, заключается в том, что время от времени могут возникать спорадические проблемы подключения, которые не занимают больше времени, чем говорят 1-2 минуты.

  • Пробовал параметр таймаута установки для большого числа (то есть 600) в ansible.cfg, но это не помогло.

  • Мы предоставляем узлы ubuntu, redhat и suse, но независимо от ОС, мы получаем эту ошибку примерно на вероятность 20%.

  • Это не то же самое или аналогичные задачи в моей плей-книжке, где он терпит неудачу, это просто случайный случай. (Иногда в модуле настройки, иногда в модуле пакета, ...)

  • Наша анзибль версия 2.1 (устанавливается вместе с ПУМ), ОС рабочей станции является Ubuntu 14,04

Итак, что нам нужно как-то, сказать, невозможно, если вы видите узел недоступным, пожалуйста, не сдавайтесь с ошибкой. Подождите некоторое время или повторите попытку n раз, прежде чем отказаться от недостижимого. Как мы можем это сделать?

+1

Если это происходит в процессе вращения новых серверов, рассмотрите возможность использования 'wait_for'. Мы используем его после запуска новых облачных серверов, чтобы ждать, пока ssh станет доступным, а затем приступим к выполнению задач для этих новых серверов. –

+0

На самом деле у меня уже есть задача wait_for, которая запускается сразу после создания экземпляров AWS и имеет wait_for, пока ssh не будет готов. Я сталкиваюсь с проблемой на более поздних этапах, то есть после установки некоторых пакетов/запуска некоторых служб и т. Д. И, как я уже упоминал выше, неудачная задача не одинакова для разных запусков.Но я могу подумать о добавлении pre_task к каждой роли, которая ждет, пока ssh не будет готова, потому что проблема, похоже, происходит между перераспределениями роли. Спасибо! – turkenh

ответ

2

Формально отвечая на ваш вопрос: вы можете увеличить количество попыток ssh в вашем файле инвентаря с помощью ansible_ssh_common_args="-o ConnectionAttempts=20". Укажите его для хоста проблем, группы хостов или виртуальной группы all (например, в файле group_vars/all.yml).

Существует также вариант конфигурации ssh_args, но я предпочитаю не изменять его, поскольку он перезаписывает аргументы ssh по умолчанию.

+0

Подождите, пожалуйста, таймаут между попытками? т. е. если оно составляет 1 сек, а увеличение количества попыток может не иметь смысла. Можем ли мы также увеличить его с помощью ansible_ssh_common_args? – turkenh

+0

1 секунда, согласно странице руководства. –

 Смежные вопросы

  • Нет связанных вопросов^_^