นี่เป็นปัญหาที่น่ารำคาญพอที่ฉันคิดว่าในที่สุดฉันก็จะถามชุมชนโดยรวมว่าจะมีวิธีแก้ปัญหาที่เป็นไปได้อย่างไร มันน่ารำคาญยิ่งกว่าที่ฉันดูเหมือนจะเป็นคนเดียวที่ประสบปัญหานี้
เป็นหลักทุกเวลาใน CentOS 7.x, sshd configs หรือส่วนใดส่วนหนึ่งของ sshd ได้รับการแก้ไขและ daemon จะเริ่มต้นใหม่ / โหลดใหม่ที่ "สุ่มจุด" ใน 3 นาทีถัดไปการเชื่อมต่อ ssh รีเซ็ตทั้งหมดแล้วเซิร์ฟเวอร์นั้น เข้าไม่ถึงสองสามวินาทีผ่าน ssh
นี่เป็นปัญหาโดยเฉพาะอย่างยิ่งสำหรับการที่จำเป็นต้องทำการเปลี่ยนแปลงเหล่านี้เป็น sshd ในบางครั้งและทำการโหลดซ้ำ (เช่นในเซิร์ฟเวอร์ CentOS 7x รุ่นใหม่) แต่ในอนาคตจะมีการเล่นแบบสุ่มไม่สามารถเชื่อมต่อกับ ssh ได้และมันจะทำให้ส่วนที่เหลือของ playbook / บทละครสำหรับโฮสต์นั้นซึ่งไม่สามารถติดต่อได้ นี่เป็นสิ่งที่ไม่ดีโดยเฉพาะอย่างยิ่งสำหรับรูปแบบโฮสต์ที่มีขนาดใหญ่เนื่องจากมีเพียงไม่กี่แบบที่จะสุ่มให้เสร็จสมบูรณ์ เป็นที่ทราบว่าไม่มีการเรียงลำดับใด ๆ เกิดขึ้นใน CentOS 5x, 6x หรือแม้แต่บน Solaris
สิ่งที่ดีที่สุดที่ฉันสามารถทำได้เพื่อหลีกเลี่ยงปัญหานี้คือการสร้างการรอ 90 วินาทีหลังจากการเปลี่ยนแปลงใด ๆ กับ sshd และแม้แต่สิ่งนี้ก็ไม่อาจป้องกันได้ทั้งหมด ทำให้ playbooks เหล่านั้นใช้เวลามากกว่า 20 นาทีในการเรียกใช้แม้ว่าจะเรียกใช้แล้ว 7-8 ครั้ง
นี่คือข้อเท็จจริงบางประการเกี่ยวกับสภาพแวดล้อมนี้:
การติดตั้งใหม่ทั้งหมดมาจาก ISO DVD อย่างเป็นทางการ เซิร์ฟเวอร์ทุกเครื่องเป็นไฮเปอร์ - วี 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 เพื่อป้องกันสิ่งนี้หรือไม่ มีบางสิ่งที่จำเป็นต้องจัดการกับสิ่งนี้เช่นความพยายามหลายครั้งในการเล่นครั้งแรกหรือไม่?
ขอบคุณล่วงหน้า!
Restart=on-failure
? ถ้าเป็นเช่นนั้นสถานะการออกคืออะไร? และ sshd ไม่ได้บันทึกข้อความผิดพลาดใด ๆ ?
sshd
และเกิดอะไรขึ้นกับการเชื่อมต่อของคุณ? คุณใช้ SSH ControlMaster
กับ Ansible ด้วยหรือไม่ คุณสามารถเปิดใช้งานได้ใน ssh_args = -o ControlMaster=auto -o ControlPersist=60s
ansible.cfg