Как предотвратить многократное выполнение роли ansible, если она указана как зависимость?

Мы разбили наше гигантское рабочее пространство ansible на отдельные простые роли, которые можно запускать самостоятельно. Все они зависят от нашей роли yum, которая предоставляет репозитории и т. д., и все роли (A, B, C) указаны в их meta.yml:

./roles_galaxy/A/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

./roles_galaxy/B/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

./roles_galaxy/C/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

Однако это приводит к тому, что роль yum-repo выполняется несколько раз, когда запускается наша книга развертывания, поэтому мы видим несколько исполнений роли yum-repo. Мы не хотим, чтобы он делал это, так как он просто занимает дополнительное время и выполняется многократно:

Плейбук:

- name: Common Roles
  hosts: things
  roles:
    - A
    - B
    - C

Выход:

PLAY [Role A] 
...
TASK [yum-repo ...]

PLAY [Role B] 
...
TASK [yum-repo ...]

PLAY [Role C] 
...
TASK [yum-repo ...]

Я пробовал allow_duplicates = false в нашем ansible.cfg, но я не думаю, что это правильное решение, поскольку оно все еще выполняется несколько раз.

Если требуется дополнительная информация, я буду более чем счастлив попытаться предоставить ее очищенную версию. В настоящее время работает ansible-2.5.5.


person Community    schedule 23.01.2019    source источник
comment
Вы используете import_role или include_role? Если это так, см. цикл Include_role устанавливает роль и зависимости несколько раз.   -  person colan    schedule 31.07.2019


Ответы (4)


Предположим, вы используете import_role и/или include_role, пока цикл Include_role не установит роли и зависимости несколько раз исправлено, я бы рекомендовал следующее:

  1. Не указывайте зависимые роли как зависимости.
  2. Указывайте их только в вызовах import_role и/или include_role.
person colan    schedule 30.07.2019
comment
Это также исправлено, чтобы предотвратить выполнение приличий роли перед задачами роли из-за правила exec роли: - Любые зависимости ролей, определенные в мета/main.yml ролей, будут запускаться первыми, с учетом фильтрации тегов и условий. см. docs.ansible.com/ansible/latest/user_guide/ - person Max Barrass; 26.09.2019

И более года спустя обнаружение дубликатов все еще не работает.

Ставлю ansible fact, а потом в других ролях использую

- name: include dependancy role
  include_role:
    name: somerole
  when: has_it_run_fact is not defined
person Philip Brown    schedule 29.04.2021

Ознакомьтесь с документами по этой теме (Дублирование ролей и исполнение).

Ansible стремится использовать наиболее эффективный подход и избегать запуска роли более одного раза, если только какие-либо используемые ею параметры не меняются каждый раз, когда она объявляется в вашей игре. Дело в том, что каждый раз, когда ваша роль yum запускается, она настраивает другой репозиторий yum?

Не уверен, насколько это будет уместно в случае с ролью Yum, однако одна из возможных стратегий состоит в том, чтобы выделить общие, единичные вещи в отдельную роль, а затем сделать общую роль зависимость главной роли. Это приводит к тому, что общая роль применяется один раз, а затем любое количество вызовов основной роли для каждого различия в параметрах.

person clockworknet    schedule 23.01.2019
comment
Случается ли, что каждый раз, когда ваша роль yum запускается, она настраивает другой репозиторий yum? Нет, она настроена на работу без каких-либо переменных, т. е. все наши роли, которые вызывают роль yum-repo, имеют то же самое, что указано в meta/main.yml. Я попытался добавить allow_duplicates: false ко всем файлам meta.yml, и это, к сожалению, ничего не изменило. - person ; 23.01.2019

используйте регистровую переменную всякий раз, когда вы запускаете playbook

что-то типа

  • имя: выполнить первоначальную настройку

    роль: абв

    регистрация: role_abc_var

    changed_when: "'Установка abc уже выполнена' не в role_abc_var.stdout"

четкое объяснение см.
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html

person cognitive    schedule 24.01.2019