이것은 이제 가능한 해결책이 무엇인지 전체 커뮤니티에 물어볼 만큼 짜증나는 문제입니다. 더욱 짜증나는 것은 이 문제를 겪고 있는 사람이 나뿐인 것 같다는 것이다.
기본적으로 CentOS 7.x에서는 언제든지 sshd 구성 또는 sshd의 일부가 수정되고 데몬이 다음 3분 이내에 "임의의 지점"에서 다시 시작/다시 로드되고 ssh 연결이 모두 재설정된 다음 ssh를 통해 서버에 연결할 수 없습니다. 몇 초 동안.
이는 때때로 sshd를 변경하고 자체적으로 다시 로드해야 하기 때문에(예: 새로운 CentOS 7x 서버 릴리스에서) ansible의 경우 특히 문제가 됩니다. 그러나 향후 게임에서는 무작위로 ssh 연결에 실패하고, 연결할 수 없는 호스트의 나머지 플레이/게임이 폭파됩니다. 일부는 무작위로 완료되지만 다른 일부는 sshd가 조작된 후 플레이북의 다양한 단계에서 실패하므로 이는 대규모 호스트 모드의 경우 특히 나쁩니다. CentOS 5x, 6x 또는 심지어 Solaris에서는 이런 일이 발생하지 않는다는 점은 주목할 가치가 있습니다.
이를 방지하기 위해 제가 할 수 있는 최선의 방법은 sshd를 변경한 후 90초 동안 대기하는 것이었습니다. 이 방법도 완전히 안전한 것은 아닙니다. 7~8번 호출되면 이러한 플레이북을 실행하는 데 20분 이상이 소요됩니다.
이 환경에 대한 몇 가지 사실은 다음과 같습니다.
모든 새로운 설치는 공식 ISO DVD에서 이루어집니다. 모든 서버는 Hyper-V 2012 게스트입니다. 이 문제가 있는 모든 서버는 CentOS 7.x입니다.
다음은 문제의 실제 결과와 일부 해킹된 솔루션입니다.
실패하다:
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}]}
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
다음 핸들러:
- name: sshd reload Linux 7x
systemd:
state: restarted
daemon_reload: yes
name: sshd
마지막으로 문제를 해결하기 위한 빈민가 수정 시도는 다음과 같습니다.
- 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")
제가 생각해낸 것보다 더 나은 해결책이 있어야 합니다. 다른 사람들도 모두 이런 상황에 처해 있었고 그와 함께 살았다는 것을 믿기 어렵습니다. 이를 방지하려면 CentOS 7.x 서버에서 무언가를 구성해야 합니까? 첫 번째 SSH가 실패할 때마다 여러 SSH를 시도하는 것과 같이 이를 처리하기 위해 필요한 것이 있습니까?
미리 감사드립니다!
답변1
이것은 일반적인 문제인 것 같습니다. 2016년 이후 Ansible SSH 재시도 패치
더 나은 해결책은 sshd가 연결될 준비가 될 때까지 기다리는 것입니다. 원래 라인다음 Ansible 코드 솔루션을 사용하세요.
[VM 생성 작업...]
- name: Kickstart 설치가 완료되고 VM이 다시 시작될 때까지 기다립니다. local_action: wait_for 호스트={{ vm_hostname }} port=22 지연=30 timeout=1200 state=started
- 이름: 이제 가상 머신을 구성합니다...
답변2
이 모듈을 사용하는 대신 systemd
다음을 시도해 보세요 service
.
- name: Restart secure shell daemon post configuration
service:
name: sshd
state: restarted