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!
Restart=on-failure
? Wenn ja, wie war der Exit-Status? Und hat sshd keine Fehlermeldung protokolliert?
sshd
und was passiert mit Ihrer Verbindung? Verwenden Sie auch SSH ControlMaster
mit Ansible? Sie können es in ansible.cfg aktivieren ssh_args = -o ControlMaster=auto -o ControlPersist=60s
.