前述のように、これは仕様によるものです。Ansibleは一度に1つのプレイのみを実行します。プレイブックは2つのプレイで構成されます(プレイブックファイルで定義されたルートレベルのYAMLリストの2つのアイテム)。最初の演劇はrole1とrole2をgroup1に適用します。そのプレイが最初に実行され、それが終了して初めて2番目のプレイが開始されます。しかし、Ansibleは劇を論理的にマージしようとはしません。結局のところ、実際にはrole2のタスクを2回実行する必要があるかもしれません。
問題への対処に関しては、これを回避する方法がいくつかあり、どの方法を選択するかは、グループとロールの詳細によって異なります。
role2のすべてのタスクがべき等である場合、つまり、タスクを複数回実行して毎回同じ結果になる場合、本当に失うのは時間だけであり、ロールを繰り返しても大丈夫です。役割の適用に非常に長い時間がかかる場合、またはべき等にすることができない場合は、次のアイデアを検討してください。
プレイブックを3つの演劇に分割し、役割を個別に適用できます。
---
- hosts: group1
roles:
- role1
- hosts: group1:group2
roles:
- role2
- hosts: group2
roles:
- role3
または、役割をグループ化する必要がある場合は、3つの役割すべてを必要とするサーバー用に3番目のグループを作成できます。他の2つのグループからそれらを取り出す必要はありません。次のように、インベントリファイルにグループを作成できます。
[group1and2:children]
group1
group2
その後、プレイブックで再び3つの演劇に分割できますが、3番目のグループを使用して、ロールの再実行を回避します。
---
- hosts: group1:!group1and2
roles:
- role1
- role2
- hosts: group1and2
roles:
- role1
- role2
- role3
- hosts: group2:!group1and2
roles:
- role2
- role3
これはかなり醜いですが、場合によっては役立つかもしれません。