เมื่อใดก็ตามที่ ansible ทำการเปลี่ยนแปลง sshd ใน CentOS7 การเล่นแบบสุ่มในอนาคตจะไม่สามารถเชื่อมต่อได้


8

นี่เป็นปัญหาที่น่ารำคาญพอที่ฉันคิดว่าในที่สุดฉันก็จะถามชุมชนโดยรวมว่าจะมีวิธีแก้ปัญหาที่เป็นไปได้อย่างไร มันน่ารำคาญยิ่งกว่าที่ฉันดูเหมือนจะเป็นคนเดียวที่ประสบปัญหานี้

เป็นหลักทุกเวลาใน 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 เพื่อป้องกันสิ่งนี้หรือไม่ มีบางสิ่งที่จำเป็นต้องจัดการกับสิ่งนี้เช่นความพยายามหลายครั้งในการเล่นครั้งแรกหรือไม่?

ขอบคุณล่วงหน้า!


1
คุณแน่ใจหรือว่าคุณเห็นการรีเซ็ตการเชื่อมต่อ ssh ที่มีอยู่เดิม ? โดยปกติการรีสตาร์ท ssh ไม่ควรส่งผลกระทบต่อการเชื่อมต่อที่มีอยู่ดังนั้นนี่อาจเป็นเงื่อนงำบางอย่าง
sourcejedi

โปรดระบุรุ่นเบิ้ลที่แน่นอนที่คุณกำลังใช้ (เช่นถ้ามีเป็นข้อผิดพลาดในโมดูล systemd คนจะสนใจสิ่งที่รุ่นที่มันเป็นใน)
sourcejedi

@sourcejedi ansible --version ansible 2.2.0.0 ไฟล์ config = /etc/ansible/ansible.cfg เส้นทางการค้นหาโมดูลที่กำหนดค่า = ค่าเริ่มต้นโดยไม่ต้องแทนที่ดีฉันหมายความว่า "อาจ" เป็นข้อผิดพลาด แต่ถ้าเป็นเช่นนั้นทำไมฉัน คนเดียวที่ประสบมัน? เว้นแต่จะไม่มีใครอยู่ที่นั่นโดยใช้ CentOS 7x พร้อมกับพูดได้ .... คุณพูดถูก แต่การรีเฟรชบริการไม่ควรส่งผลกระทบต่อการเชื่อมต่อที่มีอยู่ จริง ๆ แล้วบนเซิร์ฟเวอร์ CentOS 6x ของฉันทุกอย่างทำงานได้อย่างไม่มีที่ติใน playbook เดียวกัน
ความหนืด

เมื่อคุณบอกว่ามันถูกรีสตาร์ท - ในบันทึกของระบบนั่นคือทั้งหมดที่คุณได้รับ? หรือ systemd รายงานว่า sshd ออกแล้วและเริ่มใหม่ตามRestart=on-failure? ถ้าเป็นเช่นนั้นสถานะการออกคืออะไร? และ sshd ไม่ได้บันทึกข้อความผิดพลาดใด ๆ ?
sourcejedi

นี่ไม่ใช่ปัญหา Ansible แต่เป็นปัญหา SSH หรือเครือข่ายบางอย่าง การเริ่มต้น SSH ใหม่จะไม่ส่งผลต่อการเชื่อมต่อ SSH ปัจจุบันดังนั้นจะมีอย่างอื่นที่นี่เล่น คุณลองเชื่อมต่อ SSH จากเทอร์มินัลเป็นประจำรีสตาร์ทsshdและเกิดอะไรขึ้นกับการเชื่อมต่อของคุณ? คุณใช้ SSH ControlMasterกับ Ansible ด้วยหรือไม่ คุณสามารถเปิดใช้งานได้ใน ssh_args = -o ControlMaster=auto -o ControlPersist=60sansible.cfg
Strahinja Kustudic

คำตอบ:


0

แทนที่จะใช้systemdโมดูลให้ลองใช้serviceโมดูล:

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

1
น่าสนใจฉันจะลองและกลับไปที่หน้านี้เพื่อให้คนอื่นรู้ แต่โมดูลบริการไม่เพียงแค่จัดการไบนารี "บริการ" ซึ่งจริงๆแค่เปลี่ยนเส้นทางผ่าน systemctl? ฉันจะให้มันยิง
ความหนืด

DopeGhoti น่าเศร้าที่คำแนะนำของคุณใช้งานไม่ได้ ฉันได้รับปัญหาตรงตามเดิมมาก่อนและดูเหมือนจะไม่ขึ้นอยู่กับโมดูลระหว่างบริการหรือโมดูล systemd ใครมีข้อเสนอแนะใด ๆ
ความหนืด

0

นี่ดูเหมือนจะเป็นปัญหาทั่วไป Patch สำหรับ Ansible ssh retries จากปี 2016

ทางออกที่ดีกว่าอาจรอให้ sshd พร้อมเชื่อมต่อ ชุดข้อความเริ่มต้นพร้อมโซลูชันรหัส ansible นี้:

[งานสร้าง VM ... ]

  - ชื่อ: รอให้การติดตั้ง Kickstart เสร็จสมบูรณ์และ VM เพื่อเริ่มระบบใหม่ local_action: wait_for host = {{vm_hostname}} พอร์ต = 22 ดีเลย์ = 30 หมดเวลา = 1200 รัฐ = เริ่มแล้ว

  - ชื่อ: ตอนนี้กำหนดค่า VM ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.