Кожного разу, коли 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.