Như đã đề cập, đây là do thiết kế. Ansible thực hiện chỉ một lần chơi một lần. Playbook của bạn bao gồm hai lượt (hai mục trong danh sách YAML cấp gốc được xác định bởi tệp playbook). Vở kịch đầu tiên áp dụng vai trò 1 và vai trò 2 cho nhóm1. Vở kịch đó thực thi đầu tiên và chỉ khi nó kết thúc, vở kịch thứ hai mới bắt đầu. Nhưng Ansible không cố gắng hợp nhất các vở kịch với nhau một cách hợp lý. Rốt cuộc, bạn thực sự có thể muốn các tác vụ trong vai trò 2 chạy hai lần.
Để giải quyết vấn đề, có một vài cách bạn có thể giải quyết vấn đề này, và cách bạn chọn sẽ phụ thuộc vào chi tiết của các nhóm và vai trò.
Nếu tất cả các nhiệm vụ trong vai trò 2 là tạm thời, nghĩa là nếu chúng có thể được chạy nhiều lần và kết quả giống nhau mỗi lần, thì tất cả những gì bạn thực sự mất là thời gian và không sao để các vai trò lặp lại. Nếu các vai trò mất nhiều thời gian để áp dụng hoặc nếu bạn không thể thực hiện được, thì hãy xem xét các ý tưởng sau:
Bạn có thể chia playbook thành ba lần và áp dụng riêng từng vai trò:
---
- hosts: group1
roles:
- role1
- hosts: group1:group2
roles:
- role2
- hosts: group2
roles:
- role3
Hoặc nếu vai trò của bạn cần được nhóm lại với nhau, bạn có thể tạo nhóm thứ ba cho các máy chủ cần cả ba vai trò. Bạn không cần phải đưa họ ra khỏi hai nhóm khác. Bạn có thể tạo nhóm trong tệp kho của bạn như thế này:
[group1and2:children]
group1
group2
Sau đó, trong sổ chơi của bạn, bạn có thể lại chia thành ba lần chơi, nhưng sử dụng nhóm thứ ba để tránh các vai trò chạy lại:
---
- hosts: group1:!group1and2
roles:
- role1
- role2
- hosts: group1and2
roles:
- role1
- role2
- role3
- hosts: group2:!group1and2
roles:
- role2
- role3
Điều đó khá xấu nhưng nó có thể hữu ích trong một số trường hợp.