CentOS7에서 ansible이 sshd를 변경할 때마다 임의의 미래 플레이는 연결할 수 없습니다


8

이것은 내가 가능한 해결책이 무엇인지 커뮤니티에 마침내 물어볼 것이라고 생각했기 때문에 지금 충분히 자극적이었습니다. 내가이 문제를 겪고있는 유일한 사람 인 것처럼 보입니다.

기본적으로 CentOS 7.x, sshd 구성 또는 sshd의 일부가 수정되고 다음 3 분 동안 데몬이 "임의 지점"에서 다시 시작 / 재로드되고 ssh 연결이 모두 재설정 된 다음 해당 서버는 ssh를 통해 몇 초 동안 연결할 수 없습니다.

이것은 때때로 sshd에 대해 이러한 변경 자체를 수행하고 다시로드해야한다는 점에서 특히 문제가됩니다 (예 : 새로운 CentOS 7x 서버 빌드). 그러나 향후에는 무작위로 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 시도와 같이 이것을 처리하는 데 필요한 것이 있습니까?

미리 감사드립니다!


1
기존 ssh 연결 이 재설정 된 것을 보셨습니까? 일반적으로 ssh를 다시 시작하면 기존 연결에 영향을 미치지 않으므로 일종의 실마리가 될 수 있습니다.
sourcejedi 2016 년

사용중인 정확한 정확한 버전을 지정하십시오 (예 : systemd 모듈에 버그 있는 경우 사람들은 버전에 관심이있을 것입니다).
sourcejedi 2016 년

@sourcejedi ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg 구성된 모듈 검색 경로 = Default w / o overrides 글쎄, 나는 이것이 "버그"일 수 있음을 의미하지만, 그렇다면 왜 나인가? 그것을 경험하는 유일한 사람? 사용 가능한 CentOS 7x를 사용하는 다른 사람이 없다면 .... 그러나 서비스 새로 고침은 기존 연결에 영향을 미치지 않아야합니다. 실제로 CentOS 6x 서버에서 모든 것이 동일한 플레이 북에서 완벽하게 작동합니다.
점도 :

다시 시작한다고 말할 때-시스템 로그에 모든 것이 있습니까? 또는 sshd가 종료되었다가 systemd에보고 Restart=on-failure되었습니까? 그렇다면 종료 상태는 무엇입니까? 그리고 sshd가 오류 메시지를 기록하지 않았습니까?
sourcejedi

이것은 Ansible 문제가 아니라 SSH 또는 일부 네트워크 문제입니다. SSH를 다시 ​​시작해도 현재 SSH 연결에는 영향을 미치지 않으므로 여기에 다른 항목이 있습니다. 터미널에서 SSH를 통해 정기적으로 연결을 시도한 후 다시 시작하면 연결에 sshd어떤 영향이 있습니까? ControlMasterAnsible과 함께 SSH를 사용 하고 있습니까? ansible.cfg에서 활성화 할 수 있습니다 ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
Strahinja Kustudic

답변:


0

systemd모듈을 사용하는 대신 모듈을 사용해보십시오 service.

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

1
흥미 롭습니다. 사람들에게 알리기 위해이 페이지로 돌아갑니다. 그러나 서비스 모듈이 실제로 systemctl을 통해 리디렉션되는 "서비스"바이너리를 조작하지 않습니까? 글쎄, 나는 그것을 줄 것이다.
점도

DopeGhoti, 슬프게도 당신의 제안은 효과가 없었습니다. 이전과 정확히 같은 문제가 발생하며 서비스 또는 시스템 모듈 사이에 모듈에 의존하지 않는 것으로 보입니다. 다른 사람이 제안이 있습니까?
점도 :

0

이것은 일반적인 문제인 것 같습니다. 2016 년 Ansible ssh 재시도 패치

더 나은 해결책은 sshd가 연결될 때까지 기다리는 것입니다. 이 코드 솔루션을 갖춘 오리지널 스레드 :

[VM 생성 작업 ...]

  -name : 킥 스타트 설치가 완료되고 VM이 local_action을 재부팅 할 때까지 기다립니다 : wait_for host = {{vm_hostname}} port = 22 delay = 30 timeout = 1200 state = started

  -이름 : 이제 VM을 구성하십시오 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.