У меня есть пьеса, которая выглядит примерно так:
---
- hosts: group1
roles:
- role1
- role2
- hosts: group2
roles:
- role2
- role3
Теперь скажите, что у меня есть файл hosts, в котором есть такая запись:
[group1]
host1.example.com
[group2]
host1.example.com
Ansible будет запускать задачи в role2 TWICE для host1.example.com, потому что он отображается в 2 группах, и каждой из них назначена role2.
Как я могу заставить Ansible понять, что в нее включена одна и та же роль дважды, и поэтому он должен запускать ее только один раз?
Ответы:
Как уже упоминалось, это по замыслу. Ansible выполняет только одну игру за раз. Ваша книга воспроизведения состоит из двух пьес (два элемента в списке YAML корневого уровня, определенные файлом playbook). Первая игра применяет role1 и role2 к group1. Эта игра исполняется первой, и только после ее завершения начинается вторая игра. Но Ansible не пытается логически объединить пьесы. В конце концов, вы можете захотеть, чтобы задачи в role2 запускались дважды.
Что касается решения проблемы, есть несколько способов обойти это, и выбор, который вы выберете, будет зависеть от деталей групп и ролей.
Если все задачи в role2 являются идемпотентными, то есть если они могут выполняться несколько раз и каждый раз приводить к одному и тому же результату, то все, что вы действительно теряете, это время, и все в порядке, если роли повторяются. Если для применения ролей требуется очень много времени или если вы не можете сделать их идемпотентными, подумайте над следующими идеями:
Вы можете разделить сборник пьес на три пьесы и применять роли по отдельности:
Или, если ваши роли должны быть сгруппированы вместе, вы можете создать третью группу для серверов, которым нужны все три роли. Вам не нужно брать их из двух других групп. Вы можете создать группу в вашем файле инвентаря следующим образом:
Затем в своей пьесе вы снова можете разделиться на три пьесы, но используйте третью группу, чтобы избежать повторного запуска ролей:
Это довольно уродливо, но может быть полезно в некоторых случаях.
источник
Это по замыслу. Единственный способ сделать это - применить role2 только в одной пьесе к одной конкретной группе, а не использовать role2 в любой другой пьесе в группе, в которой могут быть общие члены, как здесь.
источник