Cada vez que ansible realiza cambios en sshd en CentOS7, una jugada futura aleatoria no puede conectarse

8

Este ha sido un problema bastante irritante ahora que pensé que finalmente le preguntaría a la comunidad en general cuál sería la posible solución. Es aún más irritante que parezca ser el único que experimenta este problema.

Esencialmente, en cualquier momento en CentOS 7.x, las configuraciones de sshd, o cualquier parte de sshd se modifican, y el demonio se reinicia / recarga en algún "punto aleatorio" en los próximos 3 minutos, todas las conexiones ssh se reinician, y luego ese servidor se reinicia inalcanzable por unos segundos a través de ssh.

Esto es especialmente un problema para ansible, ya que a veces necesita hacer estos cambios en sshd, y también volver a cargarlo (por ejemplo, en las nuevas versiones del servidor CentOS 7x). Pero luego, en el futuro, no se puede conectar aleatoriamente a ssh, y explota el resto del libro de jugadas / jugadas para ese host que no pudo ser contactado. Esto es especialmente malo para un patrón de host grande, ya que algunos se completarán al azar, pero los otros fallarán en varias etapas a lo largo del libro de jugadas después de manipular sshd. Es de destacar que nada de eso ocurre en CentOS 5x, 6x, o incluso en Solaris.

Lo mejor que puedo hacer para evitar esto es crear una espera de 90 segundos después de cualquier cambio en sshd, e incluso esto no es totalmente infalible. Sin embargo, hace que esos libros de jugadas tarden más de 20 minutos en ejecutarse si se invocan de 7 a 8 veces.

Aquí hay algunos datos sobre este entorno:

Todas las nuevas instalaciones son de DVD ISO oficiales. Todos los servidores son invitados de Hyper-v 2012 Todos los servidores que tienen este problema son CentOS 7.x

Aquí hay algunos resultados reales de los problemas y algunas soluciones trilladas:

La falla:

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

Ejemplo de uno de los cambios en 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

El siguiente controlador:

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

Finalmente, mi solución de ghetto para tratar de resolver este problema:

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

Tiene que haber una solución mejor que la que se me ocurrió, y es difícil creer que todos los demás se encuentren con esto y también lo toleren. ¿Hay algo que deba configurar en los servidores CentOS 7.x para evitar esto? ¿Hay algo en ansible que se necesita para lidiar con esto, como múltiples intentos de ssh por jugada en el primer fallo?

¡Gracias por adelantado!

Viscosidad
fuente
1
¿Estás seguro de que lo has visto restablecer las conexiones ssh existentes ? Normalmente, no se supone que reiniciar ssh afecte las conexiones existentes, por lo que esto podría ser algún tipo de pista.
sourcejedi
Por favor, especifique la versión exacta ansible que está utilizando (por ejemplo, si no es un error en el módulo systemd, la gente estará interesada cuál es la versión que estaba en).
sourcejedi
@sourcejedi ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg ruta de búsqueda del módulo configurado = Predeterminado sin anulaciones Bueno, quiero decir que "podría" ser un error, pero si es así, ¿por qué estoy? el único que lo experimenta? A menos que no haya nadie más usando CentOS 7x con ansible ... Sin embargo, tiene razón en que una actualización del servicio no debería afectar las conexiones existentes. De hecho, en mis servidores CentOS 6x, todo funciona perfectamente en el mismo libro de jugadas.
Viscosidad
Cuando dice que se reinicia, en el registro del sistema, ¿eso es todo lo que obtiene? ¿O systemd informa que sshd salió y se reinició de acuerdo con Restart=on-failure? Si es así, ¿cuál era el estado de salida? ¿Y sshd no registró ningún mensaje de error?
sourcejedi
Este no es un problema de Ansible, sino un problema de SSH o de red. Reiniciar SSH no afecta las conexiones SSH actuales, por lo que hay algo más aquí en juego. ¿Ha intentado conectarse regularmente a través de SSH desde el terminal, reiniciar sshdy qué sucede con su conexión? ¿También estás usando SSH ControlMastercon Ansible? Puede habilitarlo en ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
Strahinja Kustudic

Respuestas:

0

En lugar de usar el systemdmódulo, pruebe el servicemódulo:

- name: Restart secure shell daemon post configuration
  service: 
    name: sshd
    state: restarted
DopeGhoti
fuente
1
Interesante, lo intentaré y volveré a esta página para informar a la gente. ¿Pero el módulo de servicio no solo manipula el binario de "servicio" que realmente solo redirige a través de systemctl? Bueno, lo intentaré.
Viscosidad
DopeGhoti, lamentablemente su sugerencia no funcionó. Tengo exactamente el mismo problema que antes, y no parece depender del módulo entre el servicio o los módulos del sistema. ¿Alguien más tiene alguna sugerencia?
Viscosidad
0

Esto parece ser un problema común. Parche para reintentos ssh Ansible de 2016

Una mejor solución podría ser esperar a que sshd esté listo para conectarse. Hilo original con esta solución de código ansible:

[Tareas de creación de VM ...]

  - nombre: espere a que se complete la instalación de Kickstart y la VM reinicie local_action: wait_for host = {{vm_hostname}} puerto = 22 retraso = 30 tiempo de espera = 1200 estado = iniciado

  - nombre: ahora configure la VM ...

Nils
fuente