Ответ 1
Старый вопрос BUT для записи: используйте Ansible 2.2+, и вы можете пойти с include_role
. Именно для этой цели... см. Документацию здесь.
Можно ли повторно использовать роль в роли? Я не имею в виду определение зависимости в файле meta/main.yml роли, но включая роль в task/main.yml другой роли напрямую?
Например, я определяю пару основных ролей в ролевых книгах и несколько более высоких ролей в ролях. Я хочу, чтобы роли высокого уровня включали некоторые основные роли в дополнение к некоторым конкретным задачам.
playbooks/
rolebooks/
some_role/
roles/
webtier/
tasks/
main.yml
В playbooks/role/webtier/tasks/main.yml:
- shell: echo 'hello'
- { role: rolebooks/some_role }
- shell: echo 'still busy'
Спасибо
Старый вопрос BUT для записи: используйте Ansible 2.2+, и вы можете пойти с include_role
. Именно для этой цели... см. Документацию здесь.
AFAIK, вы не можете. Для этого нужны зависимости.
Если вы хотите избежать зависимостей (поскольку, например, вы хотите, чтобы "роль X" выполнялась между двумя задачами), вы можете сделать это в самой книге воспроизведения, если считаете, что задачи связаны между собой:
роли/webtier/задачи/main.yml:
- shell: echo 'hello'
- include: webtier.yml
- shell: echo 'role done'
В целом, это зависит от того, что вы пытаетесь сделать точно. Но в вашем примере "все еще занятый", по-видимому, подразумевает, что rolebooks/some_role
все еще работает, что невозможно (здесь нет concurrency).
Очевидно, что вы также можете создавать роли в мастер-книжке (что, вероятно, вы уже делаете):
- 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
Вы не можете, но вы можете сделать что-то подобное.
Для макета:
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
Обратите внимание, что, поскольку вы не используете типичную структуру импорта, вы можете столкнуться с некоторыми "странностями", такими как переменные по умолчанию роли, которые недоступны, если вы ранее не включили роль стандартного стиля.
Я ценю, что вы сказали, что не используете мета-зависимости, но лучшим решением, которое я придумал, является создание роли, в которой только содержит meta/dependency.yml
Это позволяет включить любое количество ролей в правильном порядке.
Убедитесь, что вы установили allow_duplicates: yes
---
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'] }
Это позволяет нам по существу вызывать роль из роли.