Как предотвратить повторное выполнение заданной роли, если она указана в качестве зависимости? - PullRequest
0 голосов
/ 23 января 2019

Мы разбили наше гигантское рабочее пространство на отдельные, простые роли, которые можно выполнять самостоятельно.Все они зависят от нашей роли 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.Мы не хотим, чтобы это делалось, поскольку это просто занимает дополнительное время и запускается многократно:

Playbook:

- 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 ...]

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

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

Ответы [ 3 ]

0 голосов
/ 24 января 2019

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

что-то вроде

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

    Роль: ABC

    регистр: role_abc_var

    updated_when: "'abc Setup уже выполнена' не в role_abc_var.stdout"

для ясного объяснения см.
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html

0 голосов
/ 31 июля 2019

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

  1. Не указывайте зависимые роли в качестве зависимостей.
  2. Укажите их только в вызовах import_role и / или include_role.
0 голосов
/ 23 января 2019

Оформление документов , которые охватывают эту тему (дублирование и выполнение ролей) .

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

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

...