Це було достатньо дратівливою проблемою зараз, коли я думав, що нарешті запитаю громаду взагалі, яке можливе рішення може бути. Ще більше дратує те, що я, здається, єдиний, хто переживає це питання.
По суті, будь-коли в CentOS 7.x, sshd-конфігурації або будь-яка частина sshd змінюється, і демон перезавантажується / перезавантажується в якійсь "випадковій точці" протягом наступних 3 хвилин, ssh-з'єднання все скидаються, і тоді цей сервер недоступний протягом декількох секунд через ssh.
Особливо це проблема для ansible в тому, що їй потрібно робити ці зміни самостійно в sshd, а також перезавантажувати їх (наприклад, у нових побудовах сервера CentOS 7x). Але потім у майбутніх програваннях він просто випадковим чином не може підключитися до ssh, і він підірве решту ігрової книги / відтворення для того хоста, з яким не вдалося зв’язатися. Це особливо погано для великого шаблону хостів, оскільки декілька випадковим чином завершаться, але інші будуть виходити з ладу на різних етапах у програмі після маніпулювання sshd. Примітно, що нічого подібного не відбувається в CentOS 5x, 6x або навіть на Solaris.
Найкраще, що я можу зробити, щоб уникнути цього, - це створити 90-секундне очікування після будь-яких змін у sshd, і навіть це не зовсім нерозумно. Тим самим цим ігровим книжкам запускається 20+ хвилин, хоча якщо вони викликаються 7-8 разів.
Ось деякі факти з цього середовища:
Всі нові встановлення з офіційних ISO DVD. Кожен сервер - гість-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, щоб запобігти цьому? Чи є в ансібі щось, що потрібно для вирішення цього питання, наприклад, кілька сш-слів за гру при першій відмові?
Спасибі заздалегідь!
Restart=on-failure
? Якщо так, то який був статус виходу? І хіба sshd не записував жодного повідомлення про помилку?
sshd
і що відбувається з вашим з'єднанням? Ви також використовуєте SSH ControlMaster
з Ansible? Ви можете ввімкнути це в ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s
.