it-swarm.com.ru

ansible: включить роль в роль?

Можно ли повторно использовать роль в роли? Я имею в виду не через определение зависимости в файле meta/main.yml роли, а как включая роль в tasks/main.yml другой роли напрямую?

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

playbooks/

  rolebooks/
    some_role/

  roles/
    webtier/
      tasks/
        main.yml

В пьесах/ролях/webtier/tasks/main.yml:

- Shell: echo 'hello'
- { role: rolebooks/some_role }
- Shell: echo 'still busy'

Спасибо

57
Michael

Старый вопрос НО для записи : используйте Ansible 2.2+, и вы можете использовать include_role. Именно для этой цели ... см. Документацию здесь .

Проверьте import_role также ... см. Документацию здесь

74
masu

AFAIK, ты не можешь. Для этого и нужны зависимости.

Если вы хотите избежать зависимостей (потому что, например, вы хотите, чтобы "роль X" выполнялась между двумя задачами), вы можете сделать это в самой книге, если считаете, что задачи связаны:

роли/webtier/задачи/main.yml:

- Shell: echo 'hello'
- include: webtier.yml
- Shell: echo 'role done'

В общем, это зависит от того, что вы пытаетесь сделать именно. Но в вашем примере "все еще занят", кажется, подразумевает, что rolebooks/some_role все еще работает, что невозможно (здесь нет параллелизма).

Очевидно, что вы также можете упорядочить роли в главной книге пьес (что, вероятно, то, что вы уже делаете):

- name: Polite foo stuff
  hosts: foo_hosts
  roles:
    - say_hello
    - rolebooks/some_role
    - say_bye

- name: Unpolite foo stuff
  hosts: !foo_hosts
  roles:
    - rolebooks/some_role
11
leucos

Вы не можете, но вы можете сделать что-то подобное.

Для макета:

roles/
    ...
    common/tasks/main.yml
    nginx/tasks/main.yml
    ...

В nginx/tasks/main.yml вы можете вызвать вашу общую задачу:

- name: Call the 'common' role to do some general setup
  include: ../../common/tasks/main.yml

Обратите внимание, что поскольку вы не используете типичную структуру импорта, вы можете столкнуться с некоторыми "странностями", такими как переменные по умолчанию для ролей, которые недоступны, если вы не включили роль стандартным способом ранее.

5
user559633

Я ценю, что вы сказали, что не используете мета-зависимости, но лучшее решение, которое я придумала, это создать роль, которая only содержит meta/dependency.yml

Это позволяет включать любое количество ролей в правильном порядке.

Убедитесь, что вы установили allow_duplicates: да

---
allow_duplicates: yes
dependencies:
  - { role: app-install-rpms,           tags: ['rpms'] }
  - { role: app-Java-config,            tags: ['config'] }
  - { role: app-directories,            tags: ['dirs'] }
  - { role: app-config-site_management, tags: ['site_management'] }
  - { role: app-config-initd,           tags: ['initd'] }
  - { role: Tomcat-boapp,               tags: ['config'] }

Это позволяет нам по сути назвать роль из роли.

2
James Morgan