Como mencionado, isso ocorre por design. Ansible executa apenas uma jogada de cada vez. Seu manual é composto por duas execuções (os dois itens na lista YAML no nível raiz definida pelo arquivo do manual). A primeira peça aplica role1 e role2 ao grupo1. Essa jogada é executada primeiro e somente quando termina a segunda peça começa. Mas o Ansible não tenta mesclar as peças logicamente. Afinal, você pode realmente querer que as tarefas na role2 sejam executadas duas vezes.
Quanto a resolver o problema, existem algumas maneiras de contornar esse problema e a escolha que você escolher dependerá dos detalhes dos grupos e funções.
Se todas as tarefas no role2 são idempotentes, ou seja, se elas podem ser executadas várias vezes e terminar com o mesmo resultado todas as vezes, tudo o que você realmente está perdendo é tempo, e não há problema em repetir as funções. Se as funções levarem muito tempo para serem aplicadas ou se você não puder torná-la idempotente, considere as seguintes idéias:
Você pode dividir o manual em três peças e aplicar as funções individualmente:
---
- hosts: group1
roles:
- role1
- hosts: group1:group2
roles:
- role2
- hosts: group2
roles:
- role3
Ou, se 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ê pode criar o grupo no seu arquivo de inventário assim:
[group1and2:children]
group1
group2
Em seu manual, você poderá novamente dividir-se em três, mas use o terceiro grupo para evitar reexecutar os papéis:
---
- 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.