Подтвердить что ты не робот

Возможно: роль в роли?

Можно ли повторно использовать роль в роли? Я не имею в виду определение зависимости в файле 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'

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Для макета:

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

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

Ответ 4

Я ценю, что вы сказали, что не используете мета-зависимости, но лучшим решением, которое я придумал, является создание роли, в которой только содержит 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'] }

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