Это стало достаточно раздражающей проблемой, так как я решил наконец спросить сообщество в целом, каким может быть возможное решение. Еще больше раздражает, что я, кажется, единственный, кто испытывает эту проблему.
По сути, в любое время в CentOS 7.x, конфигурациях sshd или любой части sshd происходит изменение, и демон перезапускается / перезагружается в некоторой «случайной точке» в течение следующих 3 минут, все соединения ssh сбрасываются, и затем этот сервер недоступно в течение нескольких секунд через ssh.
Это особенно проблема для ansible в том смысле, что он иногда должен сам вносить эти изменения в sshd, а также перезагружать его (например, в новых сборках сервера CentOS 7x). Но затем в будущих играх он просто случайно не может подключиться к ssh, и он взрывает остальную часть playbook / play для того хоста, с которым не удалось связаться. Это особенно плохо для большого шаблона хоста, так как некоторые из них будут случайным образом завершены, но другие потерпят неудачу на различных этапах вдоль книги воспроизведения после манипулирования sshd. Следует отметить, что ничего подобного не происходит в CentOS 5x, 6x или даже в Solaris.
Лучшее, что я могу сделать, чтобы избежать этого, это создать 90-секундное ожидание после любых изменений в sshd, и даже это не является абсолютно надежным. Это заставляет эти пьесы запускаться более 20 минут, хотя их вызывают 7-8 раз.
Вот некоторые факты об этой среде:
Все новые установки с официальных ISO DVD. Каждый сервер является гостем Hyper-V 2012. Каждый сервер, имеющий эту проблему, - CentOS 7.x.
Вот некоторые фактические результаты проблем и некоторые избитые решения:
Провал:
fatal: [voltron]: UNREACHABLE! => {"changed": false, "msg": "All items completed", "results": [{"_ansible_item_result": true, "item": ["rsync", "iotop", "bind-utils", "sysstat.x86_64", "lsof"], "msg": "Failed to connect to the host via ssh: Shared connection to voltron closed.\r\n", "unreachable": true}]}
Пример одного из изменений в sshd:
- name: Configure sshd to disallow root logins for security purposes on CentOS and Redhat 7x servers.
lineinfile:
backup: yes
dest: /etc/ssh/sshd_config
regexp: '^(#PermitRootLogin)'
line: "PermitRootLogin no"
state: present
when: (ansible_distribution == "CentOS" or "RedHat") and (ansible_distribution_major_version == "7")
notify: sshd reload Linux 7x
Следующий обработчик:
- name: sshd reload Linux 7x
systemd:
state: restarted
daemon_reload: yes
name: sshd
Наконец, мое гетто исправлено, чтобы попытаться объяснить эту проблему:
- name: Wait a bit on CentOS/Redhat 7x servers to ensure changes don't mess up ssh and screw up further plays.
pause:
seconds: 90
when: (ansible_distribution == "CentOS" or "RedHat") and (ansible_distribution_major_version == "7")
Должно быть лучшее решение, чем то, что я придумал, и трудно поверить, что все сталкиваются с этим и тоже с этим мирится. Что-то мне нужно настроить в серверах CentOS 7.x, чтобы предотвратить это? Есть ли что-то в ansible, что необходимо для решения этой проблемы, например, несколько попыток ssh за игру при первом сбое?
Заранее спасибо!
Restart=on-failure
? Если так, каков был статус выхода? И sshd не регистрирует сообщение об ошибке?
sshd
и что происходит с вашим соединением? Также вы используете SSH ControlMaster
с Ansible? Вы можете включить его в ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s
.