Ilekroć ansible wprowadza zmiany w sshd w CentOS7, losowa gra w przyszłości nie może się połączyć


8

Był to wystarczająco irytujący problem, kiedy pomyślałem, że w końcu zapytam całą społeczność, jakie jest możliwe rozwiązanie. Jeszcze bardziej irytujące jest to, że wydaje mi się, że tylko ja mam ten problem.

Zasadniczo, w dowolnym momencie w CentOS 7.x, konfiguracje sshd lub dowolna część sshd zostanie zmodyfikowana, a demon zostanie zrestartowany / ponownie załadowany w jakimś „losowym punkcie” w ciągu najbliższych 3 minut, połączenia ssh resetują się, a następnie ten serwer jest nieosiągalny przez kilka sekund przez ssh.

Jest to szczególnie problem dla ansible, ponieważ musi on czasami dokonywać tych zmian w sshd, a także przeładowywać go (na przykład w nowych wersjach serwera CentOS 7x). Ale potem w przyszłości gra po prostu losowo nie może połączyć się z ssh, i wysadza resztę podręcznika / gier dla tego hosta, z którym nie udało się skontaktować. Jest to szczególnie złe w przypadku dużych wzorców hostów, ponieważ niektóre z nich zostaną losowo ukończone, ale inne zawiodą na różnych etapach w podręczniku po manipulacji sshd. Należy zauważyć, że nic takiego nie występuje w CentOS 5x, 6x, a nawet w Solarisie.

Najlepszym sposobem, aby tego uniknąć, jest utworzenie 90-sekundowego oczekiwania po jakichkolwiek zmianach w sshd, a nawet to nie jest całkowicie niezawodne. Sprawia, że ​​uruchomienie tych podręczników zajmuje ponad 20 minut, jeśli zostanie wywołane 7-8 razy.

Oto kilka faktów na temat tego środowiska:

Wszystkie nowe instalacje pochodzą z oficjalnych płyt DVD ISO. Każdy serwer jest gościem hyper-v 2012 Każdy serwer, na którym występuje ten problem, to CentOS 7.x

Oto niektóre rzeczywiste skutki problemów i niektóre zhackowane rozwiązania:

Awaria:

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}]}

Przykład jednej ze zmian w 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

Następujący moduł obsługi:

- name: sshd reload Linux 7x
   systemd:
     state: restarted
     daemon_reload: yes
     name: sshd

Wreszcie moja poprawka do getta próbuje rozwiązać ten problem:

- 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")

Musi być lepsze rozwiązanie niż to, co wymyśliłem, i trudno uwierzyć, że wszyscy inni się z tym spotykają i też to znoszą. Czy jest coś, co muszę skonfigurować na serwerach CentOS 7.x, aby temu zapobiec? Czy jest coś, co jest potrzebne, aby sobie z tym poradzić, takie jak wielokrotne próby ssh na grę przy pierwszej awarii?

Z góry dziękuję!


1
Czy na pewno widziałeś, jak resetuje istniejące połączenia ssh? Zwykle ponowne uruchomienie ssh nie powinno mieć wpływu na istniejące połączenia, więc może to być jakaś wskazówka.
— sourcejedi

Podaj dokładną wersję odpowiedzi, której używasz (np. Jeśli w module systemd jest błąd, ludzie będą zainteresowani, w jakiej wersji on był).
— sourcejedi

@sourcejedi ansible --version ansible plik konfiguracyjny 2.2.0.0 = /etc/ansible/ansible.cfg skonfigurowana ścieżka wyszukiwania modułu = Domyślne w / o zastępuje Cóż, mam na myśli, że „może” to być błąd, ale jeśli tak, to dlaczego ja jedyny, który tego doświadcza? Chyba że nikt inny nie używa CentOS 7x z ansible ... Masz rację, ale odświeżenie usługi nie powinno wpływać na istniejące połączenia. Rzeczywiście, na moich serwerach CentOS 6x wszystko działa bezbłędnie na tym samym podręczniku.
— Lepkość

Kiedy mówisz, że jest restartowany - czy to wszystko w dzienniku systemowym? A może systemd zgłasza, że ​​sshd zakończył pracę i został zrestartowany zgodnie z Restart=on-failure? Jeśli tak, jaki był status wyjścia? I czy sshd nie zarejestrował żadnego komunikatu o błędzie?
— sourcejedi

To nie jest problem Ansible, ale SSH lub jakiś problem z siecią. Ponowne uruchomienie SSH nie wpływa na bieżące połączenia SSH, więc coś innego tutaj jest w grze. Czy próbowałeś regularnie łączyć się przez SSH z terminala, restartować sshdi co dzieje się z twoim połączeniem? Czy używasz również SSH ControlMasterz Ansible? Możesz włączyć to w ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
— Strahinja Kustudic

Odpowiedzi:


0

Zamiast używać systemdmodułu, wypróbuj servicemoduł:

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

1
Interesujące, spróbuję tego i wrócę do tej strony, aby poinformować ludzi. Ale czy moduł usługi nie manipuluje po prostu plikiem binarnym „service”, który tak naprawdę przekierowuje przez systemctl? Cóż, dam temu szansę.
— Lepkość

DopeGhoti, niestety twoja sugestia nie zadziałała. Dostaję dokładnie taki sam problem jak poprzednio i nie wydaje się, aby był on zależny od modułu między usługą lub modułami systemowymi. Czy ktoś jeszcze ma jakieś sugestie?
— Lepkość

0

To wydaje się być powszechnym problemem. Poprawka do ponownych prób Ansible ssh z 2016 roku

Lepszym rozwiązaniem może być poczekanie, aż sshd będzie gotowy do połączenia. Oryginalny wątek z tym rozwiązaniem kodu ansible:

[Zadania tworzenia maszyn wirtualnych ...]

  - name: Poczekaj na zakończenie instalacji Kickstart i maszynę wirtualną do ponownego uruchomienia lokalnego działanie: wait_for host = {{vm_hostname}} port = 22 opóźnienie = 30 limit czasu = 1200 stan = rozpoczęty

  - nazwa: Teraz skonfiguruj maszynę wirtualną ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.