Immer wenn ansible in CentOS7 Änderungen an sshd vornimmt, kann eine zufällige zukünftige Wiedergabe keine Verbindung herstellen

8

Dies war jetzt ein irritierendes Problem, da ich dachte, ich würde endlich die gesamte Community fragen, was eine mögliche Lösung sein könnte. Es ist noch irritierender, dass ich der einzige bin, bei dem dieses Problem auftritt.

Im Wesentlichen werden sshd-Konfigurationen oder Teile von sshd jederzeit in CentOS 7.x geändert und der Daemon wird in den nächsten 3 Minuten an einem "zufälligen Punkt" neu gestartet / neu geladen. Die ssh-Verbindungen werden alle zurückgesetzt, und dann ist dieser Server über ssh für einige sekunden nicht erreichbar.

Dies ist insbesondere für Ansible insofern ein Problem, als diese Änderungen manchmal selbst an sshd vorgenommen und auch neu geladen werden müssen (z. B. in neuen CentOS 7x-Server-Builds). Aber in zukünftigen Spielen kann es nur zufällig keine Verbindung zu ssh herstellen, und das sprengt den Rest des Playbooks / der Spiele für den Host, der nicht kontaktiert werden konnte. Dies ist besonders schlecht für ein großes Host-Muster, da einige zufällig abgeschlossen werden, die anderen jedoch in verschiedenen Phasen des Playbooks fehlschlagen, nachdem sshd manipuliert wurde. Es ist zu beachten, dass in CentOS 5x, 6x oder sogar unter Solaris nichts dergleichen vorkommt.

Das Beste, was ich tun kann, um dies zu vermeiden, ist, nach Änderungen an sshd eine Wartezeit von 90 Sekunden zu erstellen, und selbst dies ist nicht absolut narrensicher. Die Ausführung dieser Playbooks dauert jedoch mehr als 20 Minuten, wenn sie 7-8 Mal aufgerufen werden.

Hier sind einige Fakten zu dieser Umgebung:

Alle Neuinstallationen stammen von offiziellen ISO-DVDs. Jeder Server ist ein Hyper-V 2012-Gast. Jeder Server mit diesem Problem ist CentOS 7.x.

Hier sind einige aktuelle Ergebnisse der Probleme und einige abgedroschene Lösungen:

Der Fehlschlag:

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

Beispiel für eine der Änderungen an 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

Der folgende Handler:

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

Endlich mein Ghetto-Fix, um dieses Problem zu erklären:

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

Es muss eine bessere Lösung geben als die, die ich mir ausgedacht habe, und es ist kaum zu glauben, dass alle anderen darauf stoßen und es auch ertragen. Muss ich auf CentOS 7.x-Servern etwas konfigurieren, um dies zu verhindern? Gibt es etwas in Ansible, das benötigt wird, um damit umzugehen, wie beispielsweise mehrere SSH-Versuche pro Spiel beim ersten Fehlschlag?

Danke im Voraus!

Viskosität
quelle
1
Sind Sie sicher, dass vorhandene SSH-Verbindungen zurückgesetzt wurden? Normalerweise sollte ein Neustart von ssh keine Auswirkungen auf vorhandene Verbindungen haben, daher kann dies ein Hinweis sein.
Sourcejedi
Bitte geben Sie die genaue ansible Version Sie verwenden (zB wenn es ist ein Fehler in der systemd Modul, werden die Leute interessiert sein , welche Version es war in).
Sourcejedi
@sourcejedi ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg konfigurierter Modul-Suchpfad = Standard ohne Überschreibungen Nun, ich meine, es könnte ein Fehler sein, aber wenn ja, warum bin ich es? der einzige, der es erlebt? Es sei denn, es gibt niemanden, der CentOS 7x mit Ansible verwendet. Sie haben jedoch Recht, dass eine Dienstaktualisierung keine Auswirkungen auf vorhandene Verbindungen haben sollte. In der Tat funktioniert auf meinen CentOS 6x-Servern alles einwandfrei auf demselben Playbook.
Viskosität
Wenn Sie sagen, dass es neu gestartet wird - im Systemprotokoll, ist das alles, was Sie bekommen? Oder meldet systemd, dass sshd beendet wurde und gemäß neu gestartet wurde Restart=on-failure? Wenn ja, wie war der Exit-Status? Und hat sshd keine Fehlermeldung protokolliert?
Sourcejedi
Dies ist kein Ansible-Problem, sondern entweder ein SSH- oder ein Netzwerkproblem. Das Neustarten von SSH wirkt sich nicht auf die aktuellen SSH-Verbindungen aus, daher spielt hier noch etwas anderes eine Rolle. Haben Sie versucht, regelmäßig eine Verbindung über SSH vom Terminal aus herzustellen, neu zu starten sshdund was passiert mit Ihrer Verbindung? Verwenden Sie auch SSH ControlMastermit Ansible? Sie können es in ansible.cfg aktivieren ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
Strahinja Kustudic

Antworten:

0

Anstatt die Verwendung von systemdModul, versuchen Sie das serviceModul:

- name: Restart secure shell daemon post configuration
  service: 
    name: sshd
    state: restarted
DopeGhoti
quelle
1
Interessant, ich werde das versuchen und auf diese Seite zurückkehren, um die Leute zu informieren. Aber manipuliert das Servicemodul nicht einfach die "Service" -Binärdatei, die wirklich nur über systemctl umleitet? Nun, ich werde es versuchen.
Viskosität
DopeGhoti, leider hat Ihr Vorschlag nicht funktioniert. Ich bekomme genau das gleiche Problem wie zuvor und es scheint nicht modulabhängig zwischen dem Dienst oder den systemd-Modulen zu sein. Hat noch jemand Vorschläge?
Viskosität
0

Dies scheint ein häufiges Problem zu sein. Patch für Ansible ssh wiederholt ab 2016

Eine bessere Lösung könnte darin bestehen, darauf zu warten, dass sshd für die Verbindung bereit ist. Original-Thread mit dieser Ansible-Code-Lösung:

[VM-Erstellungsaufgaben ...]

  - name: Warten Sie, bis die Kickstart-Installation abgeschlossen ist und die VM neu gestartet wurde. local_action: wait_for host = {{vm_hostname}} port = 22 delay = 30 timeout = 1200 state = gestartet

  - name: Konfigurieren Sie nun die VM ...

Nils
quelle