ดังที่ได้กล่าวมานี้เป็นการออกแบบ 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
ค่อนข้างน่าเกลียด แต่อาจมีประโยชน์ในบางกรณี