Ansible: โฮสต์ปรากฏในมากกว่าหนึ่งกลุ่มและทั้งสองกลุ่มมีงานเดียวกันในพวกเขา มีวิธีใดบ้างในการรันภารกิจหนึ่งครั้ง?


9

ฉันมี playbook ที่มีหน้าตาดังนี้:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

ตอนนี้บอกว่าฉันมีไฟล์โฮสต์ที่มีรายการเช่นนี้:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible จะเรียกใช้งานใน role2 สองครั้งสำหรับ host1.example.com เพราะมันปรากฏใน 2 กลุ่มและแต่ละคนมี role2 ที่ได้รับมอบหมาย

ฉันจะทำให้ Ansible รู้ได้อย่างไรว่ามันมีบทบาทเดียวกันรวมอยู่สองครั้งและดังนั้นจึงควรรันเพียงครั้งเดียวเท่านั้น


มันจะเป็นการดีกว่าถ้าเราให้ตัวอย่างจริงกับเราแทนที่จะเป็น "role1", "role2" เป็นต้นเพราะบางทีคุณควรจะทำมันต่างออกไป แต่มันก็ขึ้นอยู่กับสิ่งที่คุณพยายามจะทำให้สำเร็จ
Antonis Christofides

คำตอบ:


10

ดังที่ได้กล่าวมานี้เป็นการออกแบบ Ansible ทำการเล่นครั้งละหนึ่งครั้ง Playbook ของคุณประกอบด้วยการเล่นสองครั้ง (สองรายการในรายการ YAML ระดับรากที่กำหนดโดยไฟล์ playbook) การเล่นครั้งแรกใช้ role1 และ role2 กับ group1 การเล่นนั้นจะดำเนินการก่อนและเมื่อการเล่นเสร็จสิ้นจะเริ่มขึ้น แต่ Ansible ไม่ได้พยายามรวมบทละครเข้าด้วยกันอย่างมีเหตุผล ท้ายที่สุดคุณอาจต้องการให้งานใน role2 ทำงานสองครั้ง

สำหรับการแก้ปัญหานั้นมีอยู่สองสามวิธีที่คุณสามารถแก้ไขได้และสิ่งที่คุณเลือกจะขึ้นอยู่กับรายละเอียดของกลุ่มและบทบาท

หากงานทั้งหมดใน role2 เป็น idempotent นั่นคือถ้าพวกเขาสามารถทำงานได้หลายครั้งและจบลงด้วยผลลัพธ์เดียวกันทุกครั้งดังนั้นสิ่งที่คุณสูญเสียจริงๆคือเวลาและก็ไม่เป็นไรที่จะให้บทบาทซ้ำ หากบทบาทใช้เวลานานในการสมัครหรือหากคุณไม่สามารถทำให้ idempotent ได้ให้พิจารณาแนวคิดต่อไปนี้:


คุณสามารถแบ่ง playbook เป็นสามบทละครและใช้บทบาทเป็นรายบุคคล:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

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

[group1and2:children]
group1
group2

จากนั้นใน playbook ของคุณคุณสามารถแบ่งออกเป็นสามบทละครอีกครั้ง แต่ใช้กลุ่มที่สามเพื่อหลีกเลี่ยงการทำงานซ้ำ:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

ค่อนข้างน่าเกลียด แต่อาจมีประโยชน์ในบางกรณี


ขอบคุณฉันคิดว่าฉันจะไปกับรูปแบบของตัวเลือก (2) - ฉันจะทำให้กลุ่มและบทบาทของฉันละเอียดยิ่งขึ้นเพื่อจัดกลุ่มเซิร์ฟเวอร์ของฉันด้วยกัน
Asfand Qazi

หากฉันโทรหาโฮสต์ผ่านตัวแปรเป็น {{host1}} และ {{host2}} ฉันจะรวมกันได้อย่างไร
BMW

หากคุณค้นหาส่วนเอกสาร: รูปแบบทั่วไป
Sahap Asci

3

นี่คือโดยการออกแบบ วิธีเดียวที่จะไปคือการใช้ role2 ใน playbook หนึ่งกับกลุ่มเฉพาะเท่านั้นและไม่ใช้ role2 ใน playbook อื่น ๆ ในกลุ่มที่อาจมีสมาชิกทั่วไปเช่นที่นี่

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