Em vez de usar o módulo systemd
, tente o módulo service
:
- name: Restart secure shell daemon post configuration
service:
name: sshd
state: restarted
Este problema tem sido bastante irritante agora que pensei em finalmente perguntar à comunidade em geral que solução possível poderia ser. É ainda mais irritante que eu pareça ser o único que está enfrentando esse problema.
Essencialmente, a qualquer momento no CentOS 7.x, sshd configs, ou qualquer parte do sshd é modificada, e o daemon é reiniciado / recarregado em algum "ponto aleatório" nos próximos 3 minutos, todas as conexões ssh são reiniciadas e então esse servidor está inacessível por alguns segundos via ssh.
Isto é especialmente um problema para o ansible, pois ele precisa fazer essas mudanças no sshd algumas vezes, e também recarregá-lo (por exemplo, em novas versões do servidor CentOS 7x). Mas então, no futuro, ele apenas aleatoriamente não pode se conectar ao ssh, e ele explode o resto do playbook / jogadas para aquele host que falhou em ser contatado. Isso é especialmente ruim para um grande padrão de host, já que alguns irão completar aleatoriamente, mas os outros falharão em vários estágios ao longo do playbook depois que o sshd for manipulado. É de notar que nada disso ocorre no CentOS 5x, 6x ou mesmo no Solaris.
O melhor que posso fazer para evitar isso é criar uma espera de 90 segundos após qualquer alteração no sshd, e mesmo isso não é totalmente infalível. Isso faz com que essas cartilhas demorem mais de 20 minutos para serem executadas, embora sejam invocadas de 7 a 8 vezes.
Aqui estão alguns fatos sobre esse ambiente:
Todas as novas instalações são de DVDs oficiais da ISO. Cada servidor é um convidado do hyper-v 2012 Todo servidor que tem esse problema é o CentOS 7.x
Aqui estão alguns resultados reais dos problemas e algumas soluções banais:
A falha:
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}]}
Exemplo de uma das mudanças no 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
O seguinte manipulador:
- name: sshd reload Linux 7x
systemd:
state: restarted
daemon_reload: yes
name: sshd
Finalmente, meu ghetto resolveu tentar explicar esse 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")
Tem de haver uma solução melhor do que a que eu criei, e é difícil acreditar que todos os outros encontrem isso e também aceitem isso. Existe algo que eu preciso configurar nos servidores do CentOS 7.x para evitar isso? Existe algo em ansible que é necessário para lidar com isso, como várias tentativas ssh por jogo na primeira falha?
Obrigado antecipadamente!
Em vez de usar o módulo systemd
, tente o módulo service
:
- name: Restart secure shell daemon post configuration
service:
name: sshd
state: restarted
Este parece ser um problema comum. Patch para novas tentativas de ssh do Ansible a partir de 2016
Uma solução melhor pode ser esperar que o sshd esteja pronto para se conectar. Tópico original com essa solução de código ansiosa:
[tarefas de criação de VM ...]
- name: Aguarde a conclusão da instalação do Kickstart e a reinicialização da VM local_action: wait_for host = {{vm_hostname}} porta = 22 atraso = 30 tempo limite = 1200 estado = iniciado
- name: Agora configure a VM ...