Como mencionado, isso ocorre por design. Ansible executa apenas uma jogada por vez. Sua cartilha consiste em duas jogadas (os dois itens na lista YAML de nível raiz definidos pelo arquivo de manual). A primeira jogada aplica o papel1 e o papel2 ao grupo1. Essa jogada é executada primeiro e, quando acaba, a segunda jogada começa. Mas a Ansible não tenta unir as peças logicamente. Afinal, você pode querer que as tarefas no role2 sejam executadas duas vezes.
Quanto a abordar o problema, há algumas maneiras de contornar isso, e você escolherá dependerá dos detalhes dos grupos e das funções.
Se todas as tarefas em role2 forem idempotentes, ou seja, se puderem ser executadas várias vezes e terminarem com o mesmo resultado todas as vezes, tudo o que você realmente está perdendo é tempo e não há problema em permitir que os papéis se repitam. Se os papéis demorarem muito tempo para serem aplicados ou se você não puder torná-lo idempotente, considere as seguintes ideias:
Você pode dividir o manual em três reproduções e aplicar as funções individualmente:
---
- hosts: group1
roles:
- role1
- hosts: group1:group2
roles:
- role2
- hosts: group2
roles:
- role3
Ou, se as suas funções precisarem ser agrupadas, você poderá criar um terceiro grupo para os servidores que precisam das três funções. Você não precisa tirá-los dos outros dois grupos. Você poderia criar o grupo em seu arquivo de inventário assim:
[group1and2:children]
group1
group2
Em seguida, no seu manual, você pode dividir novamente em três execuções, mas use o terceiro grupo para evitar a repetição de funções:
---
- hosts: group1:!group1and2
roles:
- role1
- role2
- hosts: group1and2
roles:
- role1
- role2
- role3
- hosts: group2:!group1and2
roles:
- role2
- role3
Isso é muito feio, mas pode ser útil em alguns casos.