เร่งความเร็ว Ansible

เร่งความเร็ว Ansible
ไม่เป็นความลับเลยที่การตั้งค่าเริ่มต้น Ansible ไม่สามารถทำงานได้เร็วนัก ในบทความฉันจะชี้ให้เห็นเหตุผลหลายประการสำหรับสิ่งนี้และเสนอการตั้งค่าขั้นต่ำที่มีประโยชน์ซึ่งอาจเพิ่มความเร็วให้กับโปรเจ็กต์ของคุณได้จริง

ที่นี่และด้านล่าง เราจะพูดถึง Ansible 2.9.x ซึ่งได้รับการติดตั้งใน virtualenv ที่สร้างขึ้นใหม่ในลักษณะที่คุณชื่นชอบ

หลังการติดตั้ง ให้สร้างไฟล์ “ansible.cfg” ถัดจาก Playbook ของคุณ ตำแหน่งนี้จะช่วยให้คุณสามารถถ่ายโอนการตั้งค่าเหล่านี้ไปพร้อมกับโปรเจ็กต์ได้ แถมยังจะโหลดโดยอัตโนมัติอีกด้วย

การวางท่อ

บางคนอาจเคยได้ยินเกี่ยวกับความจำเป็นในการใช้ไพพ์ไลน์ กล่าวคือ ไม่ใช่การคัดลอกโมดูลไปยังระบบไฟล์ของระบบเป้าหมาย แต่เป็นการถ่ายโอนไฟล์ zip ที่ห่อด้วย Base64 โดยตรงไปยัง stdin ของล่าม Python แต่คนอื่นอาจไม่ได้ยิน แต่ความจริงแล้ว ยังคงเป็นข้อเท็จจริง: การตั้งค่านี้ ยังคงถูกประเมินต่ำไป น่าเสียดายที่ลีนุกซ์ยอดนิยมบางรุ่นที่ใช้ในการกำหนดค่า sudo นั้นไม่ค่อยดีนักตามค่าเริ่มต้น - ดังนั้นคำสั่งนี้จึงจำเป็นต้องมี tty (เทอร์มินัล) ดังนั้น Ansible จึงทิ้งการตั้งค่าที่มีประโยชน์มากนี้ไว้โดยปิดใช้งานตามค่าเริ่มต้น

pipelining = True

การรวบรวมข้อเท็จจริง

คุณรู้ไหมว่าด้วยการตั้งค่าเริ่มต้น Ansible สำหรับการเล่นแต่ละครั้งจะเริ่มต้นการรวบรวมข้อเท็จจริงสำหรับโฮสต์ทั้งหมดที่เข้าร่วม โดยทั่วไปแล้ว ถ้าคุณไม่รู้ ตอนนี้คุณก็รู้แล้ว เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น คุณต้องเปิดใช้งานโหมดคำขอที่ชัดเจนสำหรับการรวบรวมข้อเท็จจริง (ชัดเจน) หรือโหมดอัจฉริยะ โดยจะรวบรวมข้อเท็จจริงจากเจ้าบ้านที่ไม่เคยเจอในละครครั้งก่อนเท่านั้น
รปภ. เมื่อทำการคัดลอก คุณจะต้องเลือกการตั้งค่าอย่างใดอย่างหนึ่งเหล่านี้

gathering = smart|explicit

นำการเชื่อมต่อ ssh มาใช้ซ้ำ

หากคุณเคยเรียกใช้ Ansible ในโหมดแก้ไขข้อบกพร่อง (ตัวเลือก "v" ทำซ้ำหนึ่งถึงเก้าครั้ง) คุณอาจสังเกตเห็นว่าการเชื่อมต่อ ssh มีการสร้างและใช้งานไม่ได้อยู่ตลอดเวลา ดังนั้นจึงมีรายละเอียดปลีกย่อยสองสามอย่างที่นี่เช่นกัน

คุณสามารถหลีกเลี่ยงขั้นตอนการสร้างการเชื่อมต่อ ssh ใหม่ได้ในสองระดับพร้อมกัน: ทั้งในไคลเอ็นต์ ssh โดยตรง และเมื่อถ่ายโอนไฟล์ไปยังโฮสต์ที่ได้รับการจัดการจากผู้จัดการ
หากต้องการใช้การเชื่อมต่อ ssh แบบเปิดอีกครั้ง เพียงส่งคีย์ที่จำเป็นไปยังไคลเอ็นต์ ssh จากนั้นจะเริ่มทำสิ่งต่อไปนี้: เมื่อสร้างการเชื่อมต่อ ssh เป็นครั้งแรก มันจะสร้างสิ่งที่เรียกว่าซ็อกเก็ตควบคุมเพิ่มเติม ในการติดตั้งครั้งต่อไป มันจะตรวจสอบการมีอยู่ของซ็อกเก็ตนี้ และหากสำเร็จ ให้นำกลับมาใช้ใหม่ การเชื่อมต่อ ssh ที่มีอยู่ และเพื่อให้ทั้งหมดนี้สมเหตุสมผล เรามากำหนดเวลาในการรักษาการเชื่อมต่อเมื่อไม่ได้ใช้งานกันดีกว่า สามารถอ่านเพิ่มเติมได้ใน เอกสาร sshและในบริบทของ Ansible เราก็ใช้ "การส่งต่อ" ตัวเลือกที่จำเป็นไปยังไคลเอนต์ ssh

ssh_args = "-o ControlMaster=auto -o ControlPersist=15m"

หากต้องการใช้การเชื่อมต่อ ssh ที่เปิดอยู่แล้วซ้ำเมื่อถ่ายโอนไฟล์ไปยังโฮสต์ที่ได้รับการจัดการ เพียงระบุการตั้งค่าอื่นที่ไม่รู้จัก ssh_tranfer_method เอกสารเกี่ยวกับเรื่องนี้เป็นอย่างมาก ตระหนี่ และทำให้เข้าใจผิดเพราะตัวเลือกนี้ใช้งานได้ค่อนข้างดี! แต่การอ่าน รหัสแหล่งที่มา ช่วยให้คุณเข้าใจสิ่งที่จะเกิดขึ้นอย่างแน่นอน: คำสั่ง dd จะเปิดตัวบนโฮสต์ที่ได้รับการจัดการซึ่งทำงานโดยตรงกับไฟล์ที่ต้องการ

transfer_method = piped

อย่างไรก็ตาม ในสาขา "พัฒนา" การตั้งค่านี้ก็มีอยู่เช่นกัน ไม่ไปไหนเลย.

อย่ากลัวมีด จงกลัวส้อม

การตั้งค่าที่มีประโยชน์อีกอย่างหนึ่งคือส้อม จะกำหนดจำนวนกระบวนการของผู้ปฏิบัติงานที่จะเชื่อมต่อกับโฮสต์และดำเนินงานไปพร้อมกัน เนื่องจากลักษณะเฉพาะของ Python ในฐานะภาษา จึงมีการใช้กระบวนการ ไม่ใช่เธรด เนื่องจาก Ansible ยังคงรองรับ Python 2.7 - ไม่มี asyncio สำหรับคุณ จึงไม่มีประโยชน์ที่จะแนะนำพฤติกรรมแบบอะซิงโครนัสที่นี่! ตามค่าเริ่มต้น Ansible จะทำงาน ห้า คนงาน แต่ถ้าถามถูกก็จะเปิดตัวเพิ่มเติม:

forks = 20

ฉันเพิ่งเตือนคุณทันทีว่าอาจมีปัญหาบางอย่างเกี่ยวกับจำนวนหน่วยความจำที่มีอยู่ในเครื่องควบคุม กล่าวอีกนัยหนึ่ง คุณสามารถตั้งค่า forks=100500 ได้ แต่ใครบอกว่ามันจะได้ผล

วางมันทั้งหมดเข้าด้วยกัน

ด้วยเหตุนี้ สำหรับ ansible.cfg (รูปแบบ ini) การตั้งค่าที่จำเป็นจึงอาจมีลักษณะดังนี้:

[defaults]
gathering = smart|explicit
forks = 20
[ssh_connection]
pipelining = True
ssh_args = -o ControlMaster=auto -o ControlPersist=15m
transfer_method = piped

และหากคุณต้องการซ่อนทุกอย่างในสินค้าคงคลัง YaML ปกติของบุคคลที่มีสุขภาพดี ก็อาจมีลักษณะดังนี้:

---
all:
  vars:
    ansible_ssh_pipelining: true
    ansible_ssh_transfer_method: piped
    ansible_ssh_args: -o ControlMaster=auto -o ControlPersist=15m

ขออภัย การตั้งค่านี้ใช้ไม่ได้กับการตั้งค่า "gathering = smart/explicit" และ "forks = 20" เนื่องจากไม่มี YaML ที่เทียบเท่ากัน ไม่ว่าเราจะตั้งค่าไว้ใน ansible.cfg หรือส่งผ่านตัวแปรสภาพแวดล้อม ANSIBLE_GATHERING และ ANSIBLE_FORKS

เกี่ยวกับไมโทเจน
- นี่เกี่ยวกับมิโทเจนตรงไหน? - คุณมีสิทธิ์ถามผู้อ่านที่รัก ไม่มีที่ไหนในบทความนี้ แต่ถ้าคุณพร้อมจริงๆ ที่จะอ่านโค้ดของมัน และหาคำตอบว่าเหตุใด playbook ของคุณจึงขัดข้องกับ Mitogen แต่ทำงานได้ดีกับ vanilla Ansible หรือเหตุใด Playbook เดียวกันจึงทำงานได้ดีมาก่อน แต่หลังจากการอัปเดตก็เริ่มทำสิ่งแปลก ๆ - ก็ Mitogen อาจเป็นเครื่องมือของคุณก็ได้ นำไปใช้ ทำความเข้าใจ เขียนบทความ - ฉันจะอ่านอย่างสนใจ

ทำไมฉันถึงไม่ใช้ไมโทเจนเป็นการส่วนตัว? เพราะพืชไม้ดอกจะได้ผลตราบใดที่งานนั้นเรียบง่ายจริงๆ และทุกอย่างเรียบร้อยดี อย่างไรก็ตามหากคุณหันไปทางซ้ายหรือขวาเล็กน้อย - แค่นั้นแหละเราก็มาถึงแล้ว: เพื่อตอบสนองข้อยกเว้นที่ไม่ชัดเจนจำนวนหนึ่งบินมาที่คุณและเพื่อให้ภาพสมบูรณ์สิ่งที่ขาดหายไปคือวลีทั่วไป "ขอบคุณทุกคน ทุกคนมีอิสระ” โดยทั่วไปแล้ว ฉันไม่ต้องการเสียเวลาค้นหาสาเหตุของ "การเคาะใต้ดิน" ครั้งต่อไป

การตั้งค่าเหล่านี้บางส่วนถูกค้นพบในระหว่างกระบวนการอ่าน รหัสแหล่งที่มา ปลั๊กอินการเชื่อมต่อภายใต้ชื่อที่อธิบายตนเองว่า "ssh.py" ฉันแบ่งปันผลการอ่านด้วยความหวังว่ามันจะเป็นแรงบันดาลใจให้คนอื่นดูแหล่งที่มา อ่าน ตรวจสอบการใช้งาน เปรียบเทียบกับเอกสารประกอบ - หลังจากนั้นไม่ช้าก็เร็วทั้งหมดนี้จะทำให้คุณได้ผลลัพธ์ที่เป็นบวก ขอให้โชคดี!

เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถเข้าร่วมในการสำรวจได้ เข้าสู่ระบบ, โปรด.

คุณใช้การตั้งค่า Ansible ใดต่อไปนี้เพื่อเพิ่มความเร็วให้กับโปรเจ็กต์ของคุณ

  • 69,6% การวางท่อ=true32

  • 34,8% การรวบรวม = ฉลาด/ชัดเจน16

  • 52,2% ssh_args = "-o ControlMaster=auto -o ControlPersist=..."24

  • 17,4% Transfer_method = ไปป์8

  • 63,0% ส้อม = XXX29

  • 6,5% ไม่มีสิ่งใดเลย มีเพียง Mitogen3

  • 8,7% Mitogen + ฉันจะสังเกตว่าการตั้งค่าใดเหล่านี้4

ผู้ใช้ 46 คนโหวต ผู้ใช้ 21 รายงดออกเสียง

ต้องการข้อมูลเพิ่มเติมเกี่ยวกับ Ansible หรือไม่?

  • 78,3% ใช่แน่นอน54

  • 21,7% ใช่ ฉันแค่อยากได้อะไรที่ฮาร์ดคอร์มากกว่านี้!15

  • 0,0% ไม่ และไม่จำเป็นเลย0

  • 0,0% ไม่ มันซับซ้อน!!!0

ผู้ใช้ 69 คนโหวต ผู้ใช้ 7 รายงดออกเสียง

ที่มา: will.com

เพิ่มความคิดเห็น