Come accennato, questo è di progettazione. Ansible esegue solo un gioco alla volta. Il tuo playbook è composto da due giochi (i due elementi nell'elenco YAML a livello di root definito dal file del playbook). Il primo gioco applica role1 e role2 al gruppo1. Quella giocata viene eseguita per prima e solo una volta terminata inizia la seconda giocata. Ma Ansible non tenta di unire le rappresentazioni logicamente. Dopotutto, potresti effettivamente voler eseguire due volte le attività in role2.
Per quanto riguarda la risoluzione del problema, ci sono alcuni modi per aggirare questo problema e che si sceglie dipenderà dai dettagli dei gruppi e dei ruoli.
Se tutte le attività in role2 sono idempotenti, ovvero se possono essere eseguite più volte e finiscono con lo stesso risultato ogni volta, allora tutto ciò che stai davvero perdendo è il tempo ed è giusto lasciare che i ruoli si ripetano. Se i ruoli richiedono molto tempo per essere applicati o se non riesci a renderlo idempotente, considera le seguenti idee:
È possibile dividere il playbook in tre giochi e applicare i ruoli individualmente:
---
- hosts: group1
roles:
- role1
- hosts: group1:group2
roles:
- role2
- hosts: group2
roles:
- role3
Oppure, se è necessario raggruppare i ruoli, è possibile creare un terzo gruppo per i server che richiedono tutti e tre i ruoli. Non è necessario eliminarli dagli altri due gruppi. È possibile creare il gruppo nel file di inventario in questo modo:
[group1and2:children]
group1
group2
Quindi nel tuo playbook potresti di nuovo dividerlo in tre giochi, ma usa il terzo gruppo per evitare di ricoprire ruoli:
---
- hosts: group1:!group1and2
roles:
- role1
- role2
- hosts: group1and2
roles:
- role1
- role2
- role3
- hosts: group2:!group1and2
roles:
- role2
- role3
È piuttosto brutto ma potrebbe essere utile in alcuni casi.