Ansible:ホストが複数のグループに表示され、両方のグループに同じタスクが含まれています。タスクを一度実行する方法はありますか?


9

私はこのようなプレイブックを持っています:

---
- hosts: group1
  roles:
    - role1
    - role2

- hosts: group2
  roles:
    - role2
    - role3

次のようなエントリを持つhostsファイルがあるとします。

[group1]
host1.example.com

[group2]
host1.example.com

Ansibleはhost1.example.comのrole2 TWICEでタスクを実行します。これは、2つのグループに表示され、それぞれにrole2が割り当てられているためです。

同じ役割が2回含まれていることをAnsibleに認識させるにはどうすればよいですか。


「role1」、「role2」などの代わりに実際の例を示した方がよいでしょう。おそらく違う方法で行う必要があるからです。しかし、それはあなたが実際に達成しようとしていることに依存します。
Antonis Christofides

回答:


10

前述のように、これは仕様によるものです。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

これはかなり醜いですが、場合によっては役立つかもしれません。


おかげで、私はオプション(2)のバリエーションを使用すると思います-サーバーをグループ化するために、グループとロールをより細かくします。
Asfand Qazi、2015

{{host1}}および{{host2}}として変数を介してホストを呼び出す場合、どうすればそれらをまとめることができますか?
BMW、

ドキュメントセクションを検索する場合:一般的なパターン
Sahap Asci

3

これは仕様によるものです。進む唯一の方法は、1つのプレイブック内のrole2を1つの特定のグループにのみ適用し、ここに示すように、共通のメンバーを持つグループの他のプレイブックではrole2を使用しないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.