Ogni volta che Ansible apporta modifiche a sshd in CentOS7, una riproduzione futura casuale non può connettersi


8

Questo è stato un problema abbastanza irritante ora che pensavo che avrei finalmente chiesto alla comunità in generale quale potrebbe essere una possibile soluzione. È ancora più irritante che sembri essere l'unico a riscontrare questo problema.

In sostanza, in qualsiasi momento in CentOS 7.x, le configurazioni sshd o qualsiasi parte di sshd vengono modificate e il demone viene riavviato / ricaricato in qualche "punto casuale" nei prossimi 3 minuti, tutte le connessioni ssh vengono ripristinate e quindi quel server è irraggiungibile per alcuni secondi tramite ssh.

Questo è particolarmente un problema per rispondere in quanto ha bisogno di fare queste modifiche da solo a sshd a volte, e anche ricaricarlo (ad esempio nelle nuove build di server CentOS 7x). Ma poi in futuro le riproduzioni casuali non possono collegarsi a ssh, e fa esplodere il resto del playbook / riproduzioni per quell'host che non è stato contattato. Ciò è particolarmente negativo per un modello host di grandi dimensioni, poiché alcuni verranno completati in modo casuale, ma gli altri falliranno in varie fasi lungo il playbook dopo la manipolazione di sshd. È da notare che nulla del genere si verifica in CentOS 5x, 6x o persino su Solaris.

Il meglio che posso fare per evitarlo è quello di creare un'attesa di 90 secondi dopo qualsiasi modifica a sshd, e anche questo non è totalmente infallibile. Fa sì che quei playbook impieghino più di 20 minuti a funzionare se viene invocato 7-8 volte.

Ecco alcuni fatti su questo ambiente:

Tutte le nuove installazioni provengono da DVD ISO ufficiali. Ogni server è un guest hyper-v 2012 Ogni server che presenta questo problema è CentOS 7.x

Ecco alcuni output effettivi dei problemi e alcune soluzioni compromesse:

Il fallimento:

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

Esempio di una delle modifiche a 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

Il seguente gestore:

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

Finalmente la mia correzione del ghetto per cercare di spiegare questo 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")

Deve esserci una soluzione migliore di quella che mi è venuta in mente, ed è difficile credere che tutti gli altri lo incontrino e lo tollerino. C'è qualcosa che devo configurare nei server CentOS 7.x per impedirlo? C'è qualcosa in ansible che è necessario per affrontare questo, come più tentativi ssh per gioco al primo fallimento?

Grazie in anticipo!


1
Sei sicuro di aver visto ripristinare le connessioni SSH esistenti ? Normalmente, il riavvio di ssh non dovrebbe influenzare le connessioni esistenti, quindi questo potrebbe essere una sorta di indizio.
sourcejedi

Si prega di specificare la versione esatta ansible si sta utilizzando (ad esempio, se v'è un bug nel modulo di systemd, la gente sarà interessata la versione che era in).
sourcejedi,

@sourcejedi ansible --version ansible 2.2.0.0 file di configurazione = /etc/ansible/ansible.cfg percorso di ricerca del modulo configurato = impostazione predefinita senza sostituzioni Bene, intendo dire che "potrebbe" essere un bug, ma se è così, perché lo sono l'unico a provarlo? A meno che non ci sia nessun altro là fuori che utilizza CentOS 7x con Ansible .... Hai ragione, tuttavia, nel fatto che un aggiornamento del servizio non dovrebbe influire sulle connessioni esistenti. In effetti, sui miei server CentOS 6x, tutto funziona perfettamente sullo stesso playbook.
Viscosità

Quando dici che è riavviato - nel registro di sistema, è tutto ciò che ottieni? O systemd segnala che sshd è uscito ed è stato riavviato in base a Restart=on-failure? In tal caso, qual era lo stato di uscita? E sshd non ha registrato alcun messaggio di errore?
sourcejedi,

Questo non è un problema Ansible, ma un SSH o qualche problema di rete. Il riavvio di SSH non influisce sulle connessioni SSH correnti, quindi è in gioco qualcos'altro qui. Hai provato a collegarti regolarmente tramite SSH dal terminale, riavviare sshde cosa succede con la tua connessione? Inoltre stai usando SSH ControlMastercon Ansible? Puoi abilitarlo in ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
Strahinja Kustudic,

Risposte:


0

Invece di utilizzare il systemdmodulo, prova il servicemodulo:

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

1
Interessante, lo proverò e tornerò su questa pagina per far sapere alla gente. Ma il modulo di servizio non manipola semplicemente il binario "di servizio" che in realtà reindirizza attraverso systemctl? Bene, ci proverò.
Viscosità

DopeGhoti, purtroppo il tuo suggerimento non ha funzionato. Ottengo esattamente lo stesso problema di prima e non sembra dipendere dal modulo tra il servizio o i moduli di sistema. Qualcun altro ha qualche suggerimento?
Viscosità

0

Questo sembra essere un problema comune. Patch per i tentativi di Ansible ssh dal 2016

Una soluzione migliore potrebbe essere aspettare che sshd sia pronto per la connessione. Discussione originale con questa soluzione di codice ansible:

[Attività di creazione di macchine virtuali ...]

  - nome: attendere il completamento dell'installazione di Kickstart e il riavvio della VM local_action: wait_for host = {{vm_hostname}} porta = 22 ritardo = 30 timeout = 1200 stato = avviato

  - nome: ora configura la VM ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.