Кожного разу, коли ansible вносить зміни в sshd у CentOS7, випадкова майбутня гра не може підключитися


8

Це було достатньо дратівливою проблемою зараз, коли я думав, що нарешті запитаю громаду взагалі, яке можливе рішення може бути. Ще більше дратує те, що я, здається, єдиний, хто переживає це питання.

По суті, будь-коли в 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, щоб запобігти цьому? Чи є в ансібі щось, що потрібно для вирішення цього питання, наприклад, кілька сш-слів за гру при першій відмові?

Спасибі заздалегідь!


1
Ви впевнені, що бачили скидання існуючих ssh-з'єднань? Зазвичай перезапуск ssh не повинен впливати на існуючі з'єднання, тому це може бути якась підказка.
— sourcejedi

Будь ласка, вкажіть точну відповідальну версію, яку ви використовуєте (наприклад, якщо в системному модулі є помилка, люди будуть зацікавлені, у якій версії вона була).
— sourcejedi

@sourcejedi ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg налаштований шлях пошуку модуля = За замовчуванням переосмислює Ну, я маю на увазі, що "може" бути помилкою, але якщо так, то чому я єдиний, хто переживає це? Якщо тільки немає нікого іншого, який використовує CentOS 7x з ansible .... Ти маєш рацію, але оновлення послуги не повинно впливати на існуючі з'єднання. Дійсно, на моїх серверах CentOS 6x все працює бездоганно в одній ігровій книзі.
— В'язкість

Коли ви говорите, що це перезапущено - у системному журналі, це все, що ви отримуєте? Чи повідомляє systemd про те, що sshd закрився, і його перезапустили відповідно до Restart=on-failure? Якщо так, то який був статус виходу? І хіба sshd не записував жодного повідомлення про помилку?
— sourcejedi

Це не відповідна проблема, але або SSH, або якась мережа. Перезапуск SSH не впливає на поточні підключення SSH, тому тут відтворюється щось інше. Ви намагалися регулярно підключатися через SSH з терміналу, перезавантажуватись sshdі що відбувається з вашим з'єднанням? Ви також використовуєте SSH ControlMasterз Ansible? Ви можете ввімкнути це в ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
— Страхіня Кустудіч

Відповіді:


0

Замість того, щоб використовувати systemdмодуль, спробуйте serviceмодуль:

- name: Restart secure shell daemon post configuration
  service: 
    name: sshd
    state: restarted

1
Цікаво, я спробую це і повернусь до цієї сторінки, щоб повідомити людям. Але хіба сервісний модуль не просто маніпулює "службовим" двійковим файлом, який насправді просто перенаправляє через systemctl? Що ж, я пострілю.
— В'язкість

DopeGhoti, на жаль, ваша пропозиція не спрацювала. У мене виникає точно та сама проблема, що і раніше, і, здається, вона не залежить від модуля між службою або системними модулями. Хтось ще має якісь пропозиції?
— В’язкість

0

Це, здається, є загальною проблемою. Patch for Ansible ssh retries з 2016 року

Кращим рішенням може бути зачекати, коли sshd буде готовий до підключення. Оригінальний потік із цим рішенням ансиблевного коду:

[Завдання створення VM ...]

  - ім'я: дочекайтеся завершення встановлення Kickstart і VM для перезавантаження локального запуску: wait_for host = {{vm_hostname}} port = 22 затримка = 30 timeout = 1200 state = start

  - ім'я: тепер налаштуйте VM ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.