มีเหตุผลหลายประการที่ว่าทำไม ansible อาจแขวนอยู่ที่การรวบรวมความเป็นจริง แต่ก่อนที่จะไปเพิ่มเติมต่อไปนี่คือการทดสอบครั้งแรกที่คุณควรทำในสถานการณ์ดังกล่าว:
ansible -m ping <hostname>
การทดสอบนี้เชื่อมต่อกับโฮสต์และเรียกใช้งานโค้ดที่เพียงพอเพื่อส่งคืน:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
หากวิธีนี้ใช้ได้ผลคุณสามารถตัดปัญหาการตั้งค่าหรือการเชื่อมต่อใด ๆ ได้เนื่องจากพิสูจน์ได้ว่าคุณสามารถแก้ไขชื่อโฮสต์เป้าหมายเปิดการเชื่อมต่อรับรองความถูกต้องและดำเนินการโมดูล ansible ด้วยตัวแปลภาษาไพ ธ อนระยะไกล
ตอนนี้ต่อไปนี้เป็นรายการ (ไม่ครบถ้วนสมบูรณ์) ของสิ่งต่าง ๆ ที่ผิดพลาดได้ตั้งแต่เริ่มต้นของ playbook:
คำสั่งที่ดำเนินการโดย ansible กำลังรออินพุตแบบโต้ตอบ
ฉันจำได้ว่าสิ่งนี้เกิดขึ้นกับรุ่นที่เก่ากว่าซึ่งคำสั่งจะรออินพุตอินเทอร์แอคทีฟที่จะไม่เกิดขึ้นเช่นรหัสผ่าน sudo (เมื่อคุณลืม-K
สวิตช์) หรือยอมรับลายนิ้วมือโฮสต์ ssh ใหม่ (สำหรับเป้าหมายใหม่ เป็นเจ้าภาพ)
จัดการกับ ansible รุ่นที่ทันสมัยทั้งสองกรณีเหล่านี้อย่างสง่างามและเพิ่มข้อผิดพลาดทันทีสำหรับการใช้งานปกติดังนั้นถ้าคุณไม่ทำสิ่งต่าง ๆ เช่นการโทร ssh หรือ sudo ด้วยตัวคุณเองคุณไม่ควรมีปัญหาแบบนี้ และแม้ว่าคุณจะทำมันก็จะเป็นหลังจากการรวบรวมความจริง
การเชื่อมต่อหลัก ssh ที่ตายแล้ว
มีตัวเลือกที่น่าสนใจบางอย่างที่ส่งผ่านไปยังไคลเอ็นต์ ssh ในบันทึกการแก้ปัญหาที่ให้ไว้ที่นี่:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
ตัวเลือกเหล่านี้จะถูกบันทึกไว้ในคน ssh_config
โดยค่าเริ่มต้น ansible จะพยายามฉลาดในการใช้การเชื่อมต่อ ssh สำหรับโฮสต์ที่กำหนดแทนที่จะสร้างการเชื่อมต่อใหม่สำหรับแต่ละภารกิจในการเล่นมันจะเปิดขึ้นหนึ่งครั้งและเปิดให้เล่นตลอดทั้ง playbook (และแม้กระทั่งใน playbooks)
ดีมากเนื่องจากการสร้างการเชื่อมต่อใหม่นั้นช้ากว่ามากและใช้การคำนวณมากกว่าการใช้การเชื่อมต่อที่มีอยู่แล้ว
ในทางปฏิบัติทุกการเชื่อมต่อ SSH ~/.ansible/cp/some-host-specific-path
จะตรวจสอบสำหรับการดำรงอยู่ของซ็อกเก็ตที่ การเชื่อมต่อครั้งแรกไม่สามารถค้นหาได้ดังนั้นจึงสามารถเชื่อมต่อได้ตามปกติแล้วสร้างขึ้น ทุกการเชื่อมต่อที่ตามมาจะใช้ซ็อกเก็ตนี้เพื่อผ่านการเชื่อมต่อที่สร้างไว้แล้ว
แม้ว่าการเชื่อมต่อที่กำหนดไว้จะหมดเวลาและปิดในที่สุดหลังจากที่ไม่ได้ใช้งานนานพอซ็อกเก็ตก็ปิดเช่นกันและเราจะกลับไปที่ช่องสี่เหลี่ยม
จนถึงตอนนี้ดีมาก
อย่างไรก็ตามบางครั้งการเชื่อมต่อจะตาย แต่ลูกค้า ssh ยังคงพิจารณาว่ามันสร้างขึ้น สิ่งนี้มักจะเกิดขึ้นเมื่อคุณเรียกใช้งาน playbook จากแล็ปท็อปของคุณและคุณสูญเสียการเชื่อมต่อ WiFi (หรือเปลี่ยนจาก WiFi เป็น Ethernet ฯลฯ ... )
ตัวอย่างสุดท้ายนี้เป็นสถานการณ์ที่แย่มาก: คุณสามารถ ssh ไปยังเครื่องเป้าหมายด้วยการกำหนดค่า ssh เริ่มต้น แต่ตราบใดที่การเชื่อมต่อก่อนหน้าของคุณยังคงใช้งานอยู่ ansible จะไม่ลองสร้างใหม่
ณ จุดนี้เราแค่ต้องการกำจัดซ็อกเก็ตเก่าออกและวิธีที่ง่ายที่สุดในการทำเช่นนั้นก็คือการลบมัน:
# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>
สิ่งนี้เหมาะสำหรับการแก้ไขแบบนัดเดียว แต่ถ้ามันเกิดขึ้นบ่อยเกินไปคุณอาจต้องมองหาการแก้ไขระยะยาว นี่คือตัวชี้บางอย่างที่อาจช่วยให้บรรลุเป้าหมายนี้:
- เริ่ม playbooks จากเซิร์ฟเวอร์ (ด้วยการเชื่อมต่อเครือข่ายที่เสถียรกว่าแล็ปท็อปของคุณ)
- ใช้การกำหนดค่า ansibleหรือการกำหนดค่าไคลเอ็นต์ sshโดยตรงเพื่อปิดใช้งานการแบ่งปันการเชื่อมต่อ
- ใช้ทรัพยากรเดียวกัน แต่เพื่อปรับการหมดเวลาเพื่อให้การเชื่อมต่อหลักล่มเร็วกว่าเดิม
โปรดทราบว่าในขณะที่เขียนมีตัวเลือกไม่กี่ตัวที่เปลี่ยนแปลง (ตัวอย่างเช่นการรันล่าสุดของฉันให้ฉันControlPath=/home/toadjaune/.ansible/cp/871b533295
) แต่แนวคิดทั่วไปยังคงใช้ได้
การรวบรวมความจริงใช้เวลามากเกินไป
ที่จุดเริ่มต้นของทุกการเล่นเบิ้ลเก็บรวบรวมข้อมูลจำนวนมากในระบบเป้าหมายและทำให้มันเป็นข้อเท็จจริง นี่คือตัวแปรที่คุณสามารถใช้ใน playbook ของคุณและโดยปกติแล้วจะมีประโยชน์จริง ๆ แต่บางครั้งการได้รับข้อมูลนี้อาจยาวมาก (จุดเชื่อมต่อที่ไม่ดีดิสก์ที่มี i / o สูงโหลดสูง ... )
นี้ถูกกล่าวว่าคุณไม่เคร่งครัดต้องข้อเท็จจริงที่จะเรียกใช้ PlayBook และเกือบจะแน่นอนไม่ทั้งหมดของพวกเขาดังนั้นลองและปิดการใช้สิ่งที่เราไม่ต้องการ ตัวเลือกมากมายสำหรับการที่:
สำหรับวัตถุประสงค์ในการดีบั๊กมันสะดวกมากที่จะเรียกใช้โมดูลการตั้งค่าโดยตรงจากบรรทัดคำสั่ง:
ansible -m setup <hostname>
คำสั่งสุดท้ายนี้ควรวางเช่นเดียวกับ playbook ของคุณและในที่สุดก็หมดเวลา (หรือสำเร็จ) ตอนนี้เราจะเรียกใช้งานโมดูลอีกครั้งปิดการใช้งานทุกสิ่งที่เราทำได้:
ansible -m setup -a gather_subset='!all' <hostname>
หากสิ่งนี้ยังคงค้างอยู่คุณสามารถลองและปิดการใช้งานโมดูลทั้งหมดในการเล่นของคุณได้ แต่เป็นไปได้ว่าปัญหาของคุณจะอยู่ที่อื่น
แต่ถ้าทำงานดี (และอย่างรวดเร็ว) จากนั้นมีลักษณะที่เป็นเอกสารโมดูล คุณมีสองทางเลือก:
- จำกัด ข้อเท็จจริงที่รวบรวมไปยังชุดย่อยยกเว้นสิ่งที่คุณไม่ต้องการ (ดูค่าที่เป็นไปได้สำหรับ
gather_subset
)
gather_timeout
ยังสามารถช่วยคุณแก้ไขปัญหาโดยให้เวลามากขึ้น (แม้ว่าจะเป็นการแก้ไขข้อผิดพลาดการหมดเวลาไม่ใช่การแฮงค์)
ปัญหาอื่น ๆ
เห็นได้ชัดว่าสิ่งอื่น ๆ ผิดไป ตัวชี้บางอย่างเพื่อช่วยในการดีบัก:
- ใช้ระดับ verbosity สูงสุดที่เป็นไปได้ (
-vvvv
) ซึ่งจะแสดงให้คุณเห็นทุกคำสั่งที่ดำเนินการ
- ใช้
ping
และsetup
โมดูลโดยตรงจากบรรทัดคำสั่งตามที่อธิบายไว้ข้างต้น
- ลอง ssh ด้วยตนเองหาก
ansible -m ping
ไม่ได้ผล
vagrant ssh
และตรวจสอบในระหว่างการแขวนเพื่อดูว่ามีอะไรที่เป็นประโยชน์ในps
และnetstat
? นอกจากนี้หนึ่งในผู้ต้องสงสัยคนแรกในแฮงค์คือ DNS - ตรวจสอบว่า DNS ได้รับการแก้ไขจากภายในเครื่องเสมือนหรือไม่