Відповідь: хост з'являється в більш ніж одній групі, і обидві групи мають однакові завдання в них; будь-який спосіб запустити завдання один раз?


9

У мене є ігрова книга, яка виглядає приблизно так:

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

- hosts: group2
  roles:
    - role2
    - role3

Тепер скажіть, що у мене є файл хостів, який має такий запис:

[group1]
host1.example.com

[group2]
host1.example.com

Ansible запустить завдання в role2 TWICE для host1.example.com, оскільки він відображається у двох групах, і кожній з них призначена роль2.

Як я можу змусити Ansible усвідомити, що у нього однакова роль включена двічі, і, отже, слід виконувати її лише один раз?


Краще навести нам реальні приклади замість "role1", "role2" тощо, тому що, можливо, ви повинні робити це інакше. Але це залежить від того, чого ви насправді намагаєтесь досягти.
Антоніс Христофідес

Відповіді:


10

Як було сказано, це за конструкцією. Відповідь виконує лише одну гру за один раз. Ваша книжка складається з двох п'єс (два елементи у списку YAML кореневого рівня, визначені файлом книги). Перша п’єса застосовує роль1 та роль2 до групи1. Ця гра виконується першою, і лише після її завершення починається друга гра. Але Ansible не намагається логічно об'єднати п’єси разом. Зрештою, можливо, ви хочете, щоб завдання в ролях2 виконувалися двічі.

Що стосується вирішення проблеми, то існує кілька способів вирішення цього питання, який ви оберете, залежатиме від деталей груп та ролей.

Якщо всі завдання в ролях2 є ідентичними, тобто якщо їх можна виконати кілька разів і щоразу отримувати один і той же результат, тоді все, що ви насправді втрачаєте, - час, і добре, щоб ролі повторювалися. Якщо для виконання ролей потрібне дійсно тривалий час, або ви не можете зробити це безсильним, тоді врахуйте такі ідеї:


Ви можете розділити книжку на три п’єси та застосувати ролі окремо:

---
- hosts: group1
  roles:
    - role1

- hosts: group1:group2
  roles:
    - role2

- hosts: group2
  roles:
    - role3

Або якщо ваші ролі потрібно згрупувати разом, ви можете створити третю групу для серверів, яким потрібні всі три ролі. Не потрібно виводити їх з двох інших груп. Ви можете створити групу у вашому інвентарному файлі так:

[group1and2:children]
group1
group2

Потім у своїй ігровій книзі ви знову можете розділитись на три п’єси, але використовувати третю групу, щоб уникнути повторного виконання ролей:

---
- hosts: group1:!group1and2
  roles:
    - role1
    - role2

 - hosts: group1and2
   roles:
     - role1
     - role2
     - role3

 - hosts: group2:!group1and2
   roles:
     - role2
     - role3

Це досить некрасиво, але може бути корисним у деяких випадках.


Дякую, я думаю, я піду з варіантом варіанту (2) - я зроблю свої групи та ролі більш детальними, щоб групувати мої сервери разом.
Асфанд Казі

Якщо я називаю хости через змінну як {{host1}} і {{host2}}, як я можу їх з'єднати?
BMW

Якщо шукати розділ документації: Загальні зразки
Sahap Asci

3

Це за дизайном. Єдиним способом було б застосувати роль2 лише в одній ігровій книзі до однієї певної групи, а не використовувати роль2 в будь-якій іншій ігровій книзі групи, яка може мати спільних членів, як тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.