Bất cứ khi nào có thể thay đổi sshd trong CentOS7, một lần chơi ngẫu nhiên trong tương lai không thể kết nối


8

Đây là một vấn đề đủ khó chịu khi tôi nghĩ rằng cuối cùng tôi cũng sẽ hỏi cộng đồng về giải pháp khả thi. Thậm chí còn khó chịu hơn khi tôi dường như là người duy nhất gặp phải vấn đề này.

Về cơ bản, bất cứ lúc nào trong CentOS 7.x, sshd config hoặc bất kỳ phần nào của sshd đều được sửa đổi và trình nền được khởi động lại / tải lại tại một số "điểm ngẫu nhiên" trong 3 phút tiếp theo, tất cả các kết nối ssh sẽ được đặt lại, và sau đó máy chủ đó không thể truy cập trong một vài giây qua ssh.

Điều này đặc biệt là một vấn đề đối với ansible ở chỗ đôi khi nó cần thực hiện những thay đổi này thành sshd và cũng có thể tải lại nó (ví dụ như trong các bản dựng máy chủ CentOS 7x mới). Nhưng sau đó trong các lần chơi sau, nó chỉ ngẫu nhiên không thể kết nối với ssh, và nó sẽ thổi tung phần còn lại của playbook / lượt chơi cho máy chủ đó không liên lạc được. Điều này đặc biệt tệ cho một mẫu máy chủ lớn, vì một số ít sẽ hoàn thành ngẫu nhiên, nhưng các mẫu khác sẽ thất bại ở các giai đoạn khác nhau dọc theo playbook sau khi sshd bị thao túng. Điều đáng lưu ý là không có gì thuộc loại này xảy ra trong CentOS 5x, 6x hoặc thậm chí trên Solaris.

Điều tốt nhất tôi có thể làm để tránh điều này là tạo ra 90 giây chờ đợi sau khi có bất kỳ thay đổi nào đối với sshd và thậm chí điều này không hoàn toàn dễ bị đánh lừa. Nó làm cho những cuốn sách đó mất hơn 20 phút để chạy mặc dù nếu nó được gọi 7-8 lần.

Dưới đây là một số sự thật về môi trường này:

Tất cả các cài đặt mới là từ ISO DVD chính thức. Mỗi máy chủ là một khách siêu năm 2012 Mỗi máy chủ có vấn đề này là CentOS 7.x

Đây là một số đầu ra thực tế của các vấn đề và một số giải pháp bị hack:

Sự thất bại:

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

Ví dụ về một trong những thay đổi đối với 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

Trình xử lý sau:

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

Cuối cùng, bản sửa lỗi ghetto của tôi để thử và giải quyết vấn đề này:

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

Phải có một giải pháp tốt hơn những gì tôi nghĩ ra, và thật khó để tin rằng mọi người khác gặp phải điều này và cũng đưa ra nó. Có thứ gì tôi cần cấu hình trong máy chủ CentOS 7.x để ngăn chặn điều này không? Có một cái gì đó trong ansible cần thiết để đối phó với điều này, chẳng hạn như nhiều lần thử ssh cho mỗi lần chơi trong lần thất bại đầu tiên?

Cảm ơn trước!


1
Bạn có chắc chắn đã thấy nó thiết lập lại các kết nối ssh hiện có ? Thông thường, khởi động lại ssh không được cho là ảnh hưởng đến các kết nối hiện có, vì vậy đây có thể là một số manh mối.
nguồn

Hãy xác định phiên bản ansible chính xác mà bạn đang sử dụng (ví dụ như nếu có một lỗi trong các mô-đun systemd, mọi người sẽ quan tâm đến những gì phiên bản đó là in).
nguồn

@sourcejedi ansible --version ansible 2.2.0.0 config file = /etc/ansible/ansible.cfg đường dẫn tìm kiếm mô-đun được định cấu hình = Mặc định sẽ ghi đè lên người duy nhất trải qua nó? Trừ khi không có ai khác sử dụng CentOS 7x với ansible .... Tuy nhiên, bạn nói đúng là việc làm mới dịch vụ không nên ảnh hưởng đến các kết nối hiện có. Thật vậy, trên các máy chủ CentOS 6x của tôi, mọi thứ đều hoạt động hoàn hảo trên cùng một playbook.
Độ nhớt

Khi bạn nói nó được khởi động lại - trong nhật ký hệ thống, đó có phải là tất cả những gì bạn nhận được không? Hoặc systemd báo cáo rằng sshd đã thoát và được khởi động lại theo Restart=on-failure? Nếu vậy, trạng thái thoát là gì? Và sshd không đăng nhập bất kỳ thông báo lỗi?
sourcejedi

Đây không phải là sự cố Ansible, nhưng là SSH hoặc một số sự cố mạng. Khởi động lại SSH không ảnh hưởng đến các kết nối SSH hiện tại, do đó, một cái gì đó khác đang diễn ra. Bạn đã thử kết nối thường xuyên qua SSH từ thiết bị đầu cuối, khởi động lại sshdvà điều gì xảy ra với kết nối của bạn? Bạn cũng đang sử dụng SSH ControlMastervới Ansible? Bạn có thể kích hoạt nó trong ansible.cfg ssh_args = -o ControlMaster=auto -o ControlPersist=60s.
Strahinja Kustudic

Câu trả lời:


0

Thay vì sử dụng systemdmô-đun, hãy thử servicemô-đun:

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

1
Thú vị, tôi sẽ thử điều đó và quay lại trang này để cho mọi người biết. Nhưng không phải mô-đun dịch vụ chỉ thao túng nhị phân "dịch vụ" mà thực sự chỉ chuyển hướng qua systemctl? Vâng, tôi sẽ cho nó một shot.
Độ nhớt

DopeGhoti, thật đáng buồn khi đề xuất của bạn không hoạt động. Tôi nhận được chính xác vấn đề tương tự như trước đây và dường như không phụ thuộc vào mô-đun giữa dịch vụ hoặc mô-đun systemd. Bất cứ ai khác có bất cứ lời đề nghị?
Độ nhớt

0

Đây dường như là một vấn đề phổ biến. Bản vá cho Ansible ssh thử lại từ năm 2016

Một giải pháp tốt hơn có thể là đợi sshd sẵn sàng kết nối. Chủ đề gốc với giải pháp mã ansible này:

[Nhiệm vụ tạo VM ...]

  - name: Đợi quá trình cài đặt Kickstart hoàn tất và VM khởi động lại local_action: Wait_for host = {{vm_hostname}} port = 22 delay = 30 timeout = 1200 state = started

  - name: Bây giờ cấu hình VM ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.